【问题标题】:Chaining Asynchronous function dependent on result of Parent Task依赖于父任务结果的链式异步函数
【发布时间】:2019-12-24 22:02:46
【问题描述】:

我在这里尝试做的是基于父任务执行我尝试执行或取消后续异步任务。我发现很难围绕执行以下内容并尝试以最佳方式实现这一点。我正在寻找一种以最优化的方式编写此内容的方法。

另外,我很困惑为什么即使在抛出异常之后它仍会继续下一次迭代并等待任务找出抛出的异常。我找不到关于这个的解释。

 public static async Task<TOut> AndThen<TIn, TOut>(this Task<TIn> sourceTask, Func<TIn, Task<TOut>> sf, CancellationToken cancelToken)
 {
        return await sourceTask.ContinueWith(async st => {
            var res = await st; // Raising cancel request in here.
            cancelToken.ThrowIfCancellationRequested();
            return await sf(res);
        }, TaskContinuationOptions.NotOnFaulted & TaskContinuationOptions.NotOnCanceled).Unwrap();
 }

【问题讨论】:

  • 试试TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.NotOnCanceled 而不是&amp;
  • 如果sourceTask 在故障状态下完成,理想的结果是什么?

标签: c# async-await task task-parallel-library


【解决方案1】:

作为一般规则,don't use ContinueWith。请改用await

public static async Task<TOut> AndThen<TIn, TOut>(this Task<TIn> sourceTask, Func<TIn, Task<TOut>> sf, CancellationToken cancelToken)
{
  var res = await st;
  cancelToken.ThrowIfCancellationRequested();
  return await sf(res);
}

【讨论】:

  • 那么,要处理源任务的错误状态 - 用 try catch 包装它?
  • 如果你只是想传播异常,那么什么都不做;这段代码已经做到了。如果你想做其他事情,那么可以,使用 try/catch。
猜你喜欢
  • 1970-01-01
  • 2021-04-04
  • 2023-03-16
  • 2014-07-08
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多