在不同线程上更新UI的正确方式

6

我有一个简单的类,可以更新标签,并且可以被不同的线程访问以报告我的应用程序的进度。它工作正常,但是当关闭这个应用程序时,这段代码总是会抛出一个关于尝试访问已处理对象的错误。

private delegate void SetLabelTextDelegate(string str1, string str2);
public void SetLabelText(string str1, string str2)
{
    if (this.label1.InvokeRequired || this.label2.InvokeRequired)
    {
        this.Invoke(new SetLabelTextDelegate(SetLabelText), new object[] { str1, str2});
        return;
    }
    this.label1.Text = (str1 == string.Empty) ? this.label1.Text : str1;
    this.label2.Text = (str2 == string.Empty) ? this.label2.Text : str2;
}

这不是正确的做法吗?我需要添加什么以确保它在应用程序关闭时不尝试执行UI更新吗?


@jordan.peoples 这种递归最多只会发生一次,而且是在从后台线程切换到UI线程时。 - Mario S
你应该检查 if (this.IsHandleCreated) ... - canon
1
可能是如何在窗体关闭事件中停止BackgroundWorker?的重复问题。 - Hans Passant
1
@NickV 我相信这是我根据的问题,但似乎没有提到在窗体关闭时触发调用的情况(除非我漏掉了什么)。 - Kevin DiTraglia
我认为OP不知道他在说什么... - DotNetRussell
显示剩余3条评论
1个回答

1
您收到的ObjectDisposedException很可能是由于在Form关闭时仍有未完成的Invokes(在队列中)导致的。您需要允许Invokes完成后再关闭窗体,或者处理ObjectDisposedException异常。
请参见:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接