根据父任务的结果链接异步函数
Chaining Asynchronous function dependent on result of Parent Task
我在这里试图做的是基于父任务执行我试图执行或取消后续的异步任务。我发现很难全神贯注执行以下内容并尝试以最佳方式实现它。我正在寻找一种以最优化的方式编写此内容的方法。
此外,我很困惑为什么即使在抛出异常之后它仍继续进行下一次迭代并等待任务找出抛出的异常。我找不到关于这个的解释。
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();
}
一般来说,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);
}
我在这里试图做的是基于父任务执行我试图执行或取消后续的异步任务。我发现很难全神贯注执行以下内容并尝试以最佳方式实现它。我正在寻找一种以最优化的方式编写此内容的方法。
此外,我很困惑为什么即使在抛出异常之后它仍继续进行下一次迭代并等待任务找出抛出的异常。我找不到关于这个的解释。
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();
}
一般来说,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);
}