【发布时间】:2017-09-01 13:50:02
【问题描述】:
我为每个实现定义了一个自定义异步,并按如下方式使用:
public static Task ForEachAsync<T>(this IEnumerable<T> source, int partitionCount, Func<T, Task> body)
{
return Task.WhenAll(
from partition in Partitioner.Create(source).GetPartitions(partitionCount)
select Task.Run(async delegate
{
using (partition)
{
while (partition.MoveNext())
{
await body(partition.Current).ConfigureAwait(false);
}
}
})
);
}
...
List<long> ids = new List...
await ids.ForEachAsync(8,
async (id) =>
{
await myTask(id);
}
);
这很好用,但现在我需要修改它以允许传入取消令牌。我尝试过像这样简单的方法:
List<long> ids = new List...
await ids.ForEachAsync(8,
async (id) =>
{
myToken.ThrowIfCancellationRequested();
await myTask(id);
}
);
但这失败了。正如我所料,我收到的不是OperationCanceledException 冒泡,而是由于取消而由其中一个线程引发的异常。我也尝试过将令牌传递给异步扩展方法,但这似乎也不起作用。有人可以就如何做到这一点提供指导吗?谢谢。
【问题讨论】:
-
您能否缩小您的问题范围,排除“效果很好”的部分,只关注有问题的部分,并进一步明确问题,即:预期什么以及您得到了什么?谢谢和问候,
-
您在尝试将 CancellationToken 注入扩展方法时是否使用了Task.Run( Action , CancellationToken)?
-
@AlexBell 效果很好的部分是我正在尝试修改的相关代码。但是,我将编辑我的帖子以使其更加明确。感谢您的意见。
-
@Fildor 绝对不是。我会试一试。
-
你在哪里捕捉到异常?
标签: c# asynchronous async-await .net-core cancellationtokensource