根据父任务的结果链接异步函数

Bos*_*eek 0 c# task task-parallel-library async-await

我在这里想做的是,根据父任务执行,我尝试执行或取消后续的异步任务。我发现很难全神贯注于以下内容的执行并尝试以最优化的方式实现它。我正在寻找一种以最优化的方式编写此内容的方法。

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

 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();
 }
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 5

作为一般规则,不要使用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);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你只是想传播异常,那么什么也不做;这段代码已经做到了这一点。如果你想做别的事情,那么可以使用 try/catch。 (2认同)