Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关闭表单时,我得到一个类型为';System.ObjectDisposedException';在System.Windows.Forms.dll中发生,但未在用户代码中处理_C# - Fatal编程技术网

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。这并不完美,但可以避免一些例外情况。