C# 当BackgroundWorker中发生某些事情时,是否在不同的线程上触发代码?

C# 当BackgroundWorker中发生某些事情时,是否在不同的线程上触发代码?,c#,winforms,backgroundworker,C#,Winforms,Backgroundworker,我有一个后台工作程序来运行和查找资料,当它找到资料时,我想更新我的主WinForm。我遇到的问题是,当我尝试从后台工作程序更新我的WinForm时,会出现错误,告诉我不能修改后台工作程序之外的内容(换句话说,表单中的所有内容) 有人能提供一个简单的代码示例,说明如何让代码按我希望的方式工作吗?谢谢 我相信您正在寻找OnProgressChanged事件。更多示例信息:我相信您正在查找OnProgressChanged事件。此处示例的更多信息:如果我理解正确,您希望对表单本身进行更改,但是您不能从

我有一个后台工作程序来运行和查找资料,当它找到资料时,我想更新我的主WinForm。我遇到的问题是,当我尝试从后台工作程序更新我的WinForm时,会出现错误,告诉我不能修改后台工作程序之外的内容(换句话说,表单中的所有内容)


有人能提供一个简单的代码示例,说明如何让代码按我希望的方式工作吗?谢谢

我相信您正在寻找OnProgressChanged事件。更多示例信息:

我相信您正在查找OnProgressChanged事件。此处示例的更多信息:

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

public void DoSomething(string myArg) 
{
    if(InvokeRequired) 
    {
        Invoke(new Action<string>(DoSomething), myArg);
    }
    else
    {
        // Do something here
    }
}
public void DoSomething(字符串myArg)
{
如果(需要调用)
{
调用(新操作(DoSomething),myArg);
}
其他的
{
//在这里做点什么
}
}

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

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

public void DoSomething(string myArg) 
{
    if(InvokeRequired) 
    {
        Invoke(new Action<string>(DoSomething), myArg);
    }
    else
    {
        // Do something here
    }
}
public void DoSomething(字符串myArg)
{
如果(需要调用)
{
调用(新操作(DoSomething),myArg);
}
其他的
{
//在这里做点什么
}
}

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

注意,在编码Gorilla的答案与Donn的答案合并的情况下,BackgroundWorker事件已经编组到正确的UI线程上,因此您不需要防止跨线程访问。注意,在编码Gorilla的答案与Donn的答案合并的情况下,BackgroundWorker事件已经编组到正确的UI线程上,因此您不需要防止跨线程访问。好的,所以我把这段代码放在我的主窗体中,然后我如何在我的后台工作程序中触发它?你把你想做的事情放在“在这里做点什么”的位置。然后你从工作线程调用DoSomething,就好像它是魔法一样!嗯,这不是。。。第一个调用是必需的,因此它运行调用。这会阻塞工作线程,并告诉主线程(gui线程)基本上自己调用相同的函数。只有这一次,它不需要调用;其他人跑。您可以在myArg上运行IFs和Split,以使用一个子线程执行各种操作。返回时,工作线程将恢复。因此,如果您想说,更改文本框的text属性,您可以在myArg中传递该文本,并将“//do something here”替换为:myTextBox.text=myArg;您还可以根据需要使用Action delegate.FastAI的不同变体向方法添加其他参数,非常感谢!你使我成为一个非常快乐的人。我的代码正常工作。当然也要感谢编写Gorilla的代码片段。祝你们俩周末过得愉快好的,我把这段代码放在我的主窗体中,那么我如何在我的后台工作程序中触发它呢?你把你想做的事情放在“在这里做点什么”的位置。然后你从工作线程调用DoSomething,就好像它是魔法一样!嗯,这不是。。。第一个调用是必需的,因此它运行调用。这会阻塞工作线程,并告诉主线程(gui线程)基本上自己调用相同的函数。只有这一次,它不需要调用;其他人跑。您可以在myArg上运行IFs和Split,以使用一个子线程执行各种操作。返回时,工作线程将恢复。因此,如果您想说,更改文本框的text属性,您可以在myArg中传递该文本,并将“//do something here”替换为:myTextBox.text=myArg;您还可以根据需要使用Action delegate.FastAI的不同变体向方法添加其他参数,非常感谢!你使我成为一个非常快乐的人。我的代码正常工作。当然也要感谢编写Gorilla的代码片段。祝你们俩周末过得愉快D