我刚开始学习c#中的线程和方法调用,但是我遇到了一个问题,无法找到解决方案。
我创建了一个基本的C#窗体程序,通过启动线程和调用委托来不断更新并显示一个数字。
在Form1_load上启动新线程:
private void Form1_Load(object sender, EventArgs e)
{
t = new System.Threading.Thread(DoThisAllTheTime);
t.Start();
}
公共的 void DoThisAllTheTime(不断更新数字):
public void DoThisAllTheTime()
{
while(true)
{
if (!this.IsDisposed)
{
number += 1;
MethodInvoker yolo = delegate() { label1.Text = number.ToString(); };
this.Invoke(yolo);
}
}
}
现在当我点击表单的X按钮时,我会得到以下异常信息:
“未处理的类型为'System.ObjectDisposedException'的异常在System.Windows.Forms.dll中发生”
“无法更新已删除的对象”
尽管我确实检查了表单是否被处理掉了。
编辑:我在代码中添加了catch (ObjectDisposedException ex),这解决了问题。现在代码可以正常工作了。
public void DoThisAllTheTime()
{
while(true)
{
number += 1;
try {
MethodInvoker yolo = delegate() { label1.Text = number.ToString(); };
this.Invoke(yolo);
}
catch (ObjectDisposedException ex)
{
t.Abort();
}
}
}
(!this.IsDisposed)
was calculated, but beforethis.Invoke(yolo);
was called. Welcome to the world of races.”翻译:在计算了(!this.IsDisposed)
之后,但在调用this.Invoke(yolo);
之前,窗体被释放了。欢迎来到竞争的世界。 - Joker_vD