【问题标题】:await continues before iprocess finishes在 iprocess 完成之前等待继续
【发布时间】:2015-03-25 21:58:04
【问题描述】:

我创建了一个运行 X 个线程的自定义工厂。我的问题是我希望我的 ContinueWiths 在等待之后执行代码之前完成。

调用代码:

Task t = _manager.RunCalcsCustomFactory(int.Parse(textTasksToCreate.Text), int.Parse(textMaxThreads.Text), cancelSource.Token, new Progress<string>(UpdateStatus), new Progress<int>(UpdateProgress));

Task errorHandlingTask = t.ContinueWith((tt) => ProcessError(), TaskContinuationOptions.OnlyOnFaulted);
Task cancelTask = t.ContinueWith((tttt) => TasksComplete(), TaskContinuationOptions.OnlyOnCanceled);
await Task.WhenAll(t);

UpdateStatus("Done");

在我的任务中,我立即抛出一个错误。所以我希望我的 ProcessError 在执行 UpdateStatus("Done") 之前完成。

这是我的输出:

start thread10
Waiting for tasks to finish.
Exception: Too many connections open.
Done
Error: Too many connections open.
ERROR

如果在 RunCalcsCustomFactory 中的 UpdateStatus("Error: Too many connections open.") 之前显示并且 UpdateStatus("ERROR") 在 ProcessError 中运行,请注意完成。

我希望 UpdateStatus("Done") 在 RunCalcsCustomFactory 的回调完成并且 ProcessError 完成后运行。

【问题讨论】:

    标签: c# asynchronous async-await


    【解决方案1】:

    只要您的代码中有ContinueWith,您就应该改用async/await

    try
    {
      await _manager.RunCalcsCustomFactory(int.Parse(textTasksToCreate.Text), int.Parse(textMaxThreads.Text), cancelSource.Token, new Progress<string>(UpdateStatus), new Progress<int>(UpdateProgress));
    }
    catch (OperationCanceledException)
    {
      TasksComplete();
    }
    catch (Exception ex)
    {
      ProcessError();
    }
    
    UpdateStatus("Done");
    

    【讨论】:

    • 我不是用 await Task.WhenAll(t) 做的吗;
    • @MatimalND:你只是awaiting 一项任务,而不是它的延续。
    • 我最初有你建议的代码,但我回电 UpdateStatus("Exception: Too many connections open.");在 UpdateStatus("Done") 更新 UI 之前未更新 UI。结果相同。
    • @MatimalND:好的,我现在看到你的问题了。这实际上是因为IProgress&lt;T&gt;.Report 是异步的。您可能希望在这种情况下使用 Rx;我有一个ObservableProgress that you could use as a starting point。或者,您可以通过... 抛出异常来报告异常,而不是调用 IProgress&lt;T&gt;.Report
    • 我看你比我聪明。该错误只是一个例子。我试图简化这个问题。我创建的 xTasks 中也有“IProgress.Report”。因此,在状态中显示“任务 x 完成”之前,我的输出中已完成。所以在我看来,任务还没有完成,但“等待”完成了。我可以捕捉到异常,但只是对真正等待告诉所有任务完成更新 ui 的简单方法感到好奇。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 2019-03-12
    • 2021-12-26
    相关资源
    最近更新 更多