【问题标题】:Cannot acces a disposed object with Multiple Threads无法使用多线程访问已处置的对象
【发布时间】:2013-01-31 04:24:44
【问题描述】:

每次我关闭我的应用程序时都会遇到一个非常烦人的错误,该错误告诉我:

无法访问已处置的对象

只有在我关闭应用程序时才会发生这种情况。

这是发生错误的部分代码:

/// <summary>
/// Method that shows a log to the user, about what is happening behind scenes.
/// </summary>
/// <param name="logtext"></param>
public void DisplayLog(string logtext)
{
    if (this.txtLog.InvokeRequired)
    {
        Invoke(new MethodInvoker(delegate()
            {
                txtLog.AppendText(logtext + "\n\n");
            }));
    }
    else
    {
        txtLog.AppendText(logtext + "\n\n");
    }
}

错误发生在 else 括号之间的 txtLog.AppendText 上。 它可能与我正在使用的线程有关,上面的代码没有在我创建的线程中运行,只有 Windows 窗体线程在后台运行以检查触发的事件,发送的代码logtext 这个方法在另一个内部类Serial 中,然后它从一个线程运行,有人知道如何解决这个问题吗?

提前致谢!

【问题讨论】:

  • txtLog 的具体类型是什么?

标签: c# multithreading winforms visual-studio


【解决方案1】:

使用前检查TextBox的IsDisposed属性:

if (!txtLog.IsDisposed) {
    txtLog.AppendText(logtext + "\n\n");
}

【讨论】:

  • 我不知道这是否是正确的做法,但它确实有效,谢谢。
  • @Mobstaa Dispose 只能在 UI 线程上调用,并且这段代码也在 UI 线程上执行,所以应该没有竞争条件。但不要忘记在 both 调用 AppendText 之前插入该检查。
猜你喜欢
  • 2011-10-23
  • 2011-03-25
  • 1970-01-01
  • 2019-09-20
  • 2016-10-12
  • 1970-01-01
相关资源
最近更新 更多