C# 关闭表单时,我得到一个类型为';System.ObjectDisposedException';在System.Windows.Forms.dll中发生,但未在用户代码中处理
其他信息:无法访问已处置的对象。 它突出显示了这一行代码:C# 关闭表单时,我得到一个类型为';System.ObjectDisposedException';在System.Windows.Forms.dll中发生,但未在用户代码中处理,c#,C#,其他信息:无法访问已处置的对象。 它突出显示了这一行代码: if (this.InvokeRequired) { this.Invoke(new TelemetryData(Telemetry_Data), new object[2] {data, updated}); return; } 当我试图退出应用程序并抛出此异常时,就会发生这种情况。不确定你们需要什么代码来帮助我解决这个问题,但这是我的代码: pri
if (this.InvokeRequired)
{
this.Invoke(new TelemetryData(Telemetry_Data), new object[2] {data, updated});
return;
}
当我试图退出应用程序并抛出此异常时,就会发生这种情况。不确定你们需要什么代码来帮助我解决这个问题,但这是我的代码:
private void FleetTrack_FormClosing(object sender, FormClosingEventArgs e)
{
if (lblFTstatus.Text == "CONNECTED")
{
DialogResult dialog = MessageBox.Show("You are currently connected to FleetTrack™\n\nIf you exit now, you will lose all progress on this job.",
"Exit FleetTrack™", MessageBoxButtons.YesNo);
if (dialog == DialogResult.Yes)
{
dbConnect.Delete();
Application.ExitThread();
}
else if (dialog == DialogResult.No)
{
e.Cancel = true;
}
}
else if (lblFTstatus.Text == "DISCONNECTED")
{
Application.ExitThread();
}
}
您有一个后台线程试图通过
Invoke
封送到GUI线程。您关闭表单,但后台线程继续运行。当调用Invoke
时,表单将被释放,因此您将获得一个ObjectDisposedException
肮脏的“修复”是捕获异常。既然你要关门了,你可能不在乎。但真正的解决办法是在窗体关闭之前关闭后台线程
private void Frm_FormClosing(object sender, FormClosingEventArgs e)
{
Application.ExitThread();
}
使用此关闭线程。感谢您抽出时间回复。我真的很感激。我对C#还是新手,有没有一个例子说明如何在窗体关闭之前关闭反向线程,您可以为我提供参考?这取决于线程的运行方式。如果你发布的背景线程的代码,我可以帮助更多。例如,如果您正在使用TPL(一个
任务
),您可以使用一个取消令牌源
。正如我所说,我对这一点不熟悉。我已经在我的代码中集成了一个开源SDK,它是为从PC游戏中获取数据值而预先编写的。不确定哪里/什么代码与后台线程相关。我确实做了肮脏的修理。但是如果你还想帮我做真正的修复,我可能需要一些帮助来获取你需要的代码,哈哈。对不起,我的n00b-ness。当然。您可以做的另一件事是在执行调用之前检查IsDisposed
是否为true。这并不完美,但可以避免一些例外情况。