当BackgroundWorker中出现问题时,在不同的线程上触发代码?

时间:2010-06-18 15:28:41

标签: c# winforms backgroundworker

我有一个后台工作程序运行并查找内容,当它找到东西时,我想更新我的主WinForm。我遇到的问题是,当我尝试从我的后台工作者更新我的WinForm时,我收到错误,告诉我我无法修改在我的后台工作者之外做的事情(换句话说,我的形式中的所有内容) )。

有人可以提供一个简单的代码示例,说明如何让我的代码以我想要的方式工作吗?谢谢!

2 个答案:

答案 0 :(得分:5)

我相信你正在寻找OnProgressChanged事件。更多信息,例如:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.onprogresschanged.aspx

答案 1 :(得分:4)

如果我理解正确,您希望对表单本身进行更改,但是您无法从创建表单的线程以外的线程更改表单上的控件。为了解决这个问题,我使用Form.Invoke()方法,如下所示:

public void DoSomething(string myArg) 
{
    if(InvokeRequired) 
    {
        Invoke(new Action<string>(DoSomething), myArg);
    }
    else
    {
        // Do something here
    }
}

InvokeRequired属性检查调用线程以确定它是否是对表单进行更改的正确线程,如果没有Invoke方法将调用移动到窗体的窗口线程上。