我在应用程序上使用Background worker来更新UI上的进度条。我可以使用以下内容报告进度。
backgroundWorker.ReportProgress(barProgress);
问题是ReportProgress方法只接受一个整数作为参数,但我还需要传递一个字符串来更新进度条上的标签。
progressLabel.Text = "Passed Argument";
progressLabel.Refresh();
我似乎找不到直接在BackgroundWorker对象上传递它的方法。有什么方法我没有看到或有办法做到这一点?
答案 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
。