我正在尝试使用 BackgroundWorker
在循环内执行更新我的 UI 上的进度条的简单操作。 .我不知道我做错了什么。任何帮助是极大的赞赏。
private void ProcessButtonClickAction(object param)
{
BackgroundWorker BGWUpdateUi = new BackgroundWorker();
BGWUpdateUi.ProgressChanged += (sender, args) =>
{
ProgressBarValue += args.ProgressPercentage;
((SelectedDwgFile)args.UserState).Status = "Completed";
};
BGWUpdateUi.WorkerReportsProgress = true;
foreach(var obj in FileList)
{
Thread.Sleep(250);
BGWUpdateUi.ReportProgress(pbvalueIncrement, obj);
}
}
集合是
ObservableCollection
和 ProgressBarValue
绑定(bind)到进度条的值。我已经查看了几个示例,无论我尝试哪一个 -
BackgroundWorker
, Dispatcher
- 它们都在循环后更新。
最佳答案
将要在后台运行的部分放入 DoWork
方法,然后调用 RunWorkerAsync
:
private void ProcessButtonClickAction(object param)
{
BackgroundWorker BGWUpdateUi = new BackgroundWorker()
BGWUpdateUi.DoWork += (sender, args) =>
{
foreach (var obj in FileList)
{
Thread.Sleep(250);
obj.Status = "Completed";
ProgressBarValue += pbvalueIncrement;
}
};
BGWUpdateUi.RunWorkerAsync();
}
此外,请确保将与 UI 相关的更新分派(dispatch)回 UI 线程(否则您将获得跨线程访问异常)。
关于c# - 从 ViewModel 更新 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20617743/