我刚刚开始学习c#中的线程和方法调用,但我遇到了一个我找不到解决方案的问题。
我制作了一个基本的 C# 表单程序,它通过启动线程并调用委托来不断更新和显示数字。
在 Form1_load 上启动新线程:
private void Form1_Load(object sender, EventArgs e)
{
t = new System.Threading.Thread(DoThisAllTheTime);
t.Start();
}
Public void DoThisAllTheTime(不断更新数字):
public void DoThisAllTheTime()
{
while(true)
{
if (!this.IsDisposed)
{
number += 1;
MethodInvoker yolo = delegate() { label1.Text = number.ToString(); };
this.Invoke(yolo);
}
}
}
现在,当我单击表单的 X 按钮时,出现以下异常:
'System.Windows.Forms.dll 中发生类型为“System.ObjectDisposeException”的未处理异常
无法更新已删除的对象'
虽然我实际上确实检查了表格是否已处理。
编辑:我将 catch (ObjectDisposeException 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
总是过时的。您需要拦截表单关闭事件并显式停止线程。那么你就不必这样做IsDisposed
完全测试。
有很多方法可以做到这一点。就我个人而言,我会使用System.Threading.Tasks
命名空间,但如果你想继续使用System.Threading
,你应该定义一个成员变量_updateThread
,并在加载事件中启动它:
_updateThread = new System.Threading.Thread(DoThisAllTheTime);
_updateThread.Start();
然后在闭幕活动中:
private void Form1_Closing(object sender, CancelEventArgs e)
{
_stopCounting = true;
_updateThread.Join();
}
最后,更换IsDisposed
测试并检查您的新产品的价值_stopCounting
成员变量:
public void DoThisAllTheTime()
{
MethodInvoker yolo = delegate() { label1.Text = number.ToString(); };
while(!_stopCounting)
{
number += 1;
this.Invoke(yolo);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)