Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;“操作已完成”;使用进度条时出错_C#_Wpf_Progress Bar_Backgroundworker - Fatal编程技术网

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;