
查看模型
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();
worker_ProgressChanged
voID worker_ProgressChanged(object sender,ProgressChangedEventArgs e){ CurrentProgress = e.Progresspercentage;} 在我的MovIEProcessor类中,我有方法processMovIE_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); }} 第二次调用ReportProgress(x)时,我收到错误:
此 *** 作已经调用了OperationCompleted,并且进一步调用是非法的.
CurrentProgress绑定到我的XAML
<Progressbar Minimum="0" Maximum="{Binding MaxValueProgressbar}" Value="{Binding CurrentProgress,Mode=OneWay}" /> 有人会对这里可能发生的事情有任何想法吗?
解决方法 详细说明dkozl的评论:异步可能导致问题.您发布的代码中没有任何内容会导致问题,但当然您发布的代码示例远非完整.
如果在processMovIE_DoWork()方法中有一个await语句(这是使方法异步的通常原因),那么该方法只会执行到第一个await语句的点,然后它将退出.
就BackgrounDWorker类而言,这标志着工作的结束.它无法知道会调用某些延续.因此,当您调用ReportProgress()方法时,该 *** 作实际上已完成,使对ReportProgress()的调用非法.
你有几个选择:
>摆脱await语句并同步执行这些 *** 作.最好通过调用API的同步版本.
>摆脱BackgrounDWorker,直接调用processMovIE_DoWork()方法(尽管可能已重命名为其他方法).在这种情况下,您只需直接更新CurrentProgress属性,而不是调用ReportProgress()方法.
恕我直言,第二种选择更为可取.您可以简单地等待您的processMovIE_DoWork()方法,并避免处理BackgrounDWorker的所有麻烦.
总结以上是内存溢出为你收集整理的c# – 使用进度条时“ *** 作已完成”错误全部内容,希望文章能够帮你解决c# – 使用进度条时“ *** 作已完成”错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)