c# – 使用进度条时“ *** 作已完成”错误

c# – 使用进度条时“ *** 作已完成”错误,第1张

概述我目前有以下内容: 查看模型 MovieProcessor movieProcessor = new MovieProcessor(SelectedPath, this);BackgroundWorker worker = new BackgroundWorker();worker.WorkerReportsProgress = true;worker.DoWork += moviePro 我目前有以下内容:

查看模型

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# – 使用进度条时“ *** 作已完成”错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1247936.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存