如何使用Background Worker将参数(字符串)发送到UI线程?

时间:2016-06-01 18:37:17

标签: c# multithreading winforms backgroundworker

我在应用程序上使用Background worker来更新UI上的进度条。我可以使用以下内容报告进度。

backgroundWorker.ReportProgress(barProgress);

问题是ReportProgress方法只接受一个整数作为参数,但我还需要传递一个字符串来更新进度条上的标签。

progressLabel.Text = "Passed Argument";        
progressLabel.Refresh();

我似乎找不到直接在BackgroundWorker对象上传递它的方法。有什么方法我没有看到或有办法做到这一点?

3 个答案:

答案 0 :(得分:3)

  

问题是ReportProgress方法只接受一个整数作为参数

实际上还有另一个create table方法See here.允许您传递其他任意对象,然后可以通过overload属性访问该对象。

例如:

ReportProgress

然后在backgroundWorker.ReportProgress(barProgress, "Passed Argument"); 事件中:

ProgressChanged

答案 1 :(得分:1)

overload of ReportProgress有一个userstate参数。这类型为object,因此它可以是您喜欢的任何类型。

请从DoWork处理程序中调用它,如下所示:

backgroundWorker.ReportProgress(barProgress, "Passed Argument");

并在ProgressChanged处理程序中访问它,如下所示:

progressLabel.Text = (string)e.UserState;        
progressLabel.Refresh();

答案 2 :(得分:0)

是的,您可以,只需要调用与该控件关联的Dispatcher

Dispatcher.BeginInvoke(new Action(()=>{
    progressLabel.Text = "Passed Argument";        
    progressLabel.Refresh();
});

用户界面在单线程公寓(STA)中运行,并且通常不允许跨线程访问(您可能已经获得 CrossThreadException < / em>如果你之前尝试过这个)。通过调用Dispatcher,您基本上可以告诉它在UI线程再次处理时要执行什么。

请确保您不要从UI-Thread本身调用Dispatcher.Invoke,这会使其死锁。如果您有可以从UI或其他线程调用的方法,则可以检查当前是否具有名为CheckAccess的隐藏方法(无自动完成或智能感知)的访问权限,如果您返回true可以直接访问该控件,如果必须使用Dispatcher,则可以false