5

我刚刚开始学习 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.ObjectDisposedException' 类型的未处理异常

无法更新已删除的对象'

虽然我实际上确实检查了表格是否已处理。

编辑:我在解决问题的代码中添加了 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();
             }
      }
 }
4

3 回答 3

3

你的电话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);
    }
}
于 2013-10-27T15:51:45.397 回答
2

只需将此覆盖放在您的表单类中:

protected override void OnClosing(CancelEventArgs e) {
    t.Abort();
    base.OnClosing(e);
}
于 2013-10-27T16:00:00.263 回答
-3
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Thread.CurrentThread.Abort();
}
于 2016-05-17T17:50:25.423 回答