System.ObjectDisposedException: Доступ к ликвидированному объекту невозможен - C# (234898)
Формулировка задачи:
Смастерил Irc Client, но при закрытии формы с чатом вылетает
System.ObjectDisposedException: Доступ к ликвидированному объекту невозможен
Прошу помочь, вод, собственно, сам код.using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Configuration;
using System.Collections.Specialized;
using TechLifeForum;
using System.Threading;
namespace WindowsFormsApplication44
{
public partial class Form4 : Form
{
IrcClient client;
public string a;
public Form4()
{
InitializeComponent();
txtName.ReadOnly = true;
this.MouseDown += new MouseEventHandler(Form4_MouseDown);
}
void Form4_MouseDown(object sender, MouseEventArgs e)
{
base.Capture = false;
Message m = Message.Create(base.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);
this.WndProc(ref m);
}
private void Form4_Load(object sender, EventArgs e)
{
btnConnect_Click(sender, e);
}
private delegate void _UpdateUsers(string[] userlist);
private void UpdateUsers(string[] userlist)
{
#region CrossThreadCheck
if (InvokeRequired)
{
this.Invoke(new _UpdateUsers(UpdateUsers), (object)userlist);
return;
}
#endregion
lstNames.Items.Clear();
foreach (string u in userlist)
lstNames.Items.Add(u);
}// UpdateUsers
private void UserJoined(string user)
{
ShowMessage("*" + user + " присоединился к комнате чата");
}// UserJoined
private void UserLeft(string user)
{
ShowMessage("*" + user + " покинул комнату чата");
}// UserLeft
private void ChannelMessage(string user, string message)
{
ShowMessage("<" + user + ">: " + message);
}// ChannelMessage
private void NoticeMessage(string user, string message)
{
ShowMessage("<--Заметка--> " + user + ": " + message);
}// NoticeMessage
private void PrivateMessage(string user, string message)
{
ShowMessage("<--Личное сообщение--> от " + user + ">: " + message);
}// PrivateMessage
private delegate void _ShowMessage(string message);
private void ShowMessage(string message)
{
#region CrossThreadCheck
if (InvokeRequired)
{
this.Invoke(new _ShowMessage(ShowMessage), message);
return;
}
#endregion
rtbWindow.AppendText("\n" + message);
rtbWindow.ScrollToCaret();
}
private void Connect()
{
// connect to the irc server
client.Connect("#LittleHlp");
}// Connect
private void txtSend_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13) // enter key
{
e.Handled = true;
btnSend_Click(sender, e);
}
}
private void AddEvents()
{
// Save settings event
// events triggered by the client
client.UpdateUsers += new UpdateUserListEventDelegate(UpdateUsers);
client.UserJoined += new UserJoinedEventDelegate(UserJoined);
client.UserLeft += new UserLeftEventDelegate(UserLeft);
client.ChannelMessage += new ChannelMesssageEventDelegate(ChannelMessage);
client.NoticeMessage += new NoticeMessageEventDelegate(NoticeMessage);
client.PrivateMessage += new PrivateMessageEventDelegate(PrivateMessage);
client.Disconnected += new DisconnectedEventDelegate(Disconnect);
client.ServerMessage += new ServerMessageEventDelegate(ShowMessage);
}// AddEvents
private void timer1_Tick(object sender, EventArgs e)
{
usrNum.Text = lstNames.Items.Count.ToString();
}
private void pictureBox1_Click(object sender, EventArgs e)
{
Disconnect();
this.Close();
}
private void pictureBox2_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
}
private void pictureBox1_MouseEnter(object sender, EventArgs e)
{
pictureBox1.Image = Properties.Resources.Close;
}
private void pictureBox1_MouseLeave(object sender, EventArgs e)
{
pictureBox1.Image = Properties.Resources.Clos;
}
private void pictureBox2_MouseEnter(object sender, EventArgs e)
{
pictureBox2.Image = Properties.Resources.m2;
}
private void pictureBox2_MouseLeave(object sender, EventArgs e)
{
pictureBox2.Image = Properties.Resources.m1;
}
private void btnSend_Click(object sender, EventArgs e)
{
if (chkRaw.Checked)
{
client.SendRAW("PRIVMSG " + txtName.Text + " " + txtSend.Text.Trim());
ShowMessage("<--Личное сообщение--> к " + txtName.Text + ">: " + txtSend.Text);
}
else
{
client.SendMessage(txtSend.Text.Trim());
ShowMessage("<" + client.Nick + ">: " + txtSend.Text);
}
txtSend.Clear();
txtSend.Focus();
}
private void btnConnect_Click(object sender, EventArgs e)
{
Disconnect();
Form2 main = this.Owner as Form2;
a = main.label1.Text;
if (a == "Chesko")
{
txtName.ReadOnly = false;
txtSend.Text = "";
txtName.BackColor = System.Drawing.SystemColors.Window;
txtName.ForeColor = System.Drawing.SystemColors.WindowText;
}
if (client != null)
{
client.Disconnect();
return;
}
client = new IrcClient("zoidberg.centralchat.net", 6667);
client.Nick = a;
AddEvents();
Thread t = new Thread(Connect);
t.IsBackground = true;
t.Start();
btnSend.Visible = true;
}
private void lstNames_SelectedIndexChanged(object sender, EventArgs e)
{
string name = lstNames.SelectedItem.ToString();
if (name.IndexOf("@") >-1 | name.IndexOf("~") >-1)
{
txtName.Text = name.Remove(0, 1);
}
else
{
txtName.Text = name;
}
if (name == "@ChanServ")
{
txtName.Text = "";
MessageBox.Show("Невозможно отправить личное сообщение данному пользователю");
}
}
private void Disconnect()
{
if (client != null)
{
client.Disconnect();
client = null;
}
}
}
}Решение задачи: «System.ObjectDisposedException: Доступ к ликвидированному объекту невозможен»
textual
Листинг программы
private void DeleteEvents()
{
client.UpdateUsers -= new UpdateUserListEventDelegate(UpdateUsers);
client.UserJoined -= new UserJoinedEventDelegate(UserJoined);
client.UserLeft -= new UserLeftEventDelegate(UserLeft);
client.ChannelMessage -= new ChannelMesssageEventDelegate(ChannelMessage);
client.NoticeMessage -= new NoticeMessageEventDelegate(NoticeMessage);
client.PrivateMessage -= new PrivateMessageEventDelegate(PrivateMessage);
client.Disconnected -= new DisconnectedEventDelegate(Disconnect);
client.ServerMessage -= new ServerMessageEventDelegate(ShowMessage);
}// DeleteEvents