代码之家  ›  专栏  ›  技术社区  ›  Missy

C#具有进度报告且返回值不报告进度的任务

  •  1
  • Missy  · 技术社区  · 6 年前

    我试图在一个方法中运行一个任务,并让该方法返回一个值。我之所以使用任务是因为我需要进度报告。

       private async void CallLongRunningTask()
       {
           string fileName = "TestFN";
           Progress<string> progress = new Progress<string>();
           progress.ProgressChanged += (_, newText) => lbl.Text=newText;
           bool retVal = await Task.Run(() => LongRunningTask(fileName, progress));
           Task.WaitAll();
           // do some other stuff    
    
       }
    
       public bool LongRunningTask(string fn, IProgress<string> progress)
       {
           // long running task with progress report
             while (i < 100000000)
            {
                i++;
                if (i % 10000 == 0)
                {
                    progress.Report("Processing "+i.ToString());
                }
            }
            return true;
       }
    

    正如所料,它通过了WaitAll,返回到前面的方法。

    所以,我试过这个:

    got rid of async in the signature
    
    bool retVal = Task.Run(() => LongRunningTask(fileName, progress));
    bool retVal = Task.Run(async () => LongRunningTask(fileName, progress));
    

    两次,我都失去了进步。

    所以我试着改变我的通话程序:

       Task.Run(() => CallLongRunningTask()).Wait();
    

    这打破了我的进度报告,因为我的进度报告更新了表格上的标签,所以有一些交叉线程污染。

    任何想法或想法或任何方式的帮助,将不胜感激!

    1 回复  |  直到 6 年前
        1
  •  3
  •   Nkosi    6 年前

    WaitAll

    private async Task CallLongRunningTask() {
        string fileName = "TestFN";
        Progress<string> progress = new Progress<string>();
        progress.ProgressChanged += (_, newText) => lbl.Text=newText;
    
        //waiting here for long running task to finish
        bool retVal = await Task.Run(() => LongRunningTask(fileName, progress));
    
        // do some other stuff after waiting
    }
    

    异步等待一路蔓延。您需要等待一切,包括调用方法。

    await CallLongRunningTask();
    

    等等。

    如果从事件处理程序调用,这是唯一的异常 async void 可以使用

    private async void OnSomeHandler(object sender, EventArgs args) {
        //...
    
        await CallLongRunningTask();
    
        //...
    }
    

    Async/Await - Best Practices in Asynchronous Programming