我有两种形式,一种是MainForm
,第二种是DebugForm
。MainForm 有一个按钮,可以像这样设置和显示 DebugForm,并将引用传递给已经打开的 SerialPort:
private DebugForm DebugForm; //Field
private void menuToolsDebugger_Click(object sender, EventArgs e)
{
if (DebugForm != null)
{
DebugForm.BringToFront();
return;
}
DebugForm = new DebugForm(Connection);
DebugForm.Closed += delegate
{
WindowState = FormWindowState.Normal;
DebugForm = null;
};
DebugForm.Show();
}
在 DebugForm 中,我附加了一个方法来处理DataReceived
串行端口连接的事件(在 DebugForm 的构造函数中):
public DebugForm(SerialPort connection)
{
InitializeComponent();
Connection = connection;
Connection.DataReceived += Connection_DataReceived;
}
然后在Connection_DataReceived
方法中,我在 DebugForm 中更新了一个 TextBox,即使用 Invoke 进行更新:
private void Connection_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
_buffer = Connection.ReadExisting();
Invoke(new EventHandler(AddReceivedPacketToTextBox));
}
但我有一个问题。一旦我关闭 DebugForm,它就会ObjectDisposedException
在Invoke(new EventHandler(AddReceivedPacketToTextBox));
Line 上抛出一个。
我怎样才能解决这个问题?欢迎任何提示/帮助!
更新
我发现如果我在按钮事件 click 中删除事件,并在该按钮单击中关闭表单,一切都很好,我的调试表单毫无例外地被关闭......多么奇怪!
private void button1_Click(object sender, EventArgs e)
{
Connection.DataReceived -= Connection_DebugDataReceived;
this.Close();
}