C# &引用;“操作已完成”;使用进度条时出错
我目前有以下情况: 查看模型C# &引用;“操作已完成”;使用进度条时出错,c#,wpf,progress-bar,backgroundworker,C#,Wpf,Progress Bar,Backgroundworker,我目前有以下情况: 查看模型 MovieProcessor movieProcessor = new MovieProcessor(SelectedPath, this); BackgroundWorker worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.DoWork += movieProcessor.processMovie_DoWork; worker.ProgressChanged
MovieProcessor movieProcessor = new MovieProcessor(SelectedPath, this);
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += movieProcessor.processMovie_DoWork;
worker.ProgressChanged += worker_ProgressChanged;
progressBar.Show();
worker.RunWorkerAsync();
工人的进步发生了变化
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
CurrentProgress = e.ProgressPercentage;
}
在我的MovieProcessor
类中,我有方法processMovie\u-DoWork
public async void processMovie_DoWork(object sender, DoWorkEventArgs e)
{
for (int x = 0; x < totalFilesToProcess; ++x)
{
// Do stuff like calling API
(sender as BackgroundWorker).ReportProgress(x);
}
}
有人知道这里会发生什么吗?请详细说明dkozl的评论: 可能是
async
导致了该问题。您发布的代码中没有任何内容会导致问题,但您发布的代码示例当然远未完成
如果在processMovie\u DoWork()
方法中有一个await
语句(这是使方法async
),那么该方法将只执行到第一个await
语句的点,然后退出
就BackgroundWorker
类而言,这标志着工作的结束。它无法知道会调用某种延续。因此,当您调用ReportProgress()
方法时,操作实际上已经完成,使得调用ReportProgress()
非法
您在这里有几个选项:
wait
语句并同步执行这些操作。最好通过调用API的同步版本BackgroundWorker
,直接调用您的processMovie\u DoWork()
方法(尽管可能重命名为其他方法)。在这种情况下,您只需直接更新CurrentProgress
属性,而不是调用ReportProgress()
方法嗯,第二种选择更可取。您只需等待
您的processMovie\u DoWork()
方法,就可以避免处理BackgroundWorker
的所有麻烦。我刚刚遇到了这个问题,试图使用BackgroundWorker从Web API轮询状态。
我通过删除async
并将Wait
操作符更改为Task.Wait()
解决了这个问题,它工作得非常好
这是我的代码,它代替了“//执行类似调用API的操作”
”:
我希望这对其他人有帮助。我相信您已经解决了这个问题。尝试从您的方法中删除async
。我收到了相同的错误消息,但原因不同,它是由后台工作人员完成后调用报告进度引起的。对我来说,根本原因是在我的后台工作人员被解雇后,来自外部库的回调。谢谢
<ProgressBar Minimum="0" Maximum="{Binding MaxValueProgressBar}" Value="{Binding CurrentProgress, Mode=OneWay}" />
var task = JobManager.GetJobStatus(id);
task.Wait();
var status = task.Result;