C# 如何快速取消较大批次的Task.AwaitAll

C# 如何快速取消较大批次的Task.AwaitAll,c#,task,cancellation,C#,Task,Cancellation,假设我有这样一个片段: public async Task WorkItem(WorkItem workItem, CancellationToken token) { Logger.Log("Starting..."); token.ThrowIfCancellationRequested(); } public async Task BatchProcessor(IList<WorkItem> workItems, CancellationToken token) {

假设我有这样一个片段:

public async Task WorkItem(WorkItem workItem, CancellationToken token) {
  Logger.Log("Starting...");
  token.ThrowIfCancellationRequested();
}

public async Task BatchProcessor(IList<WorkItem> workItems, CancellationToken token) {
  var tasks = workItems.Select(wi => WorkItem(wi, token)).ToList();
  await Task.WhenAll(tasks);
}
公共异步任务工作项(工作项工作项,取消令牌){
Logger.Log(“启动…”);
token.ThrowIfCancellationRequested();
}
公共异步任务批处理程序(IList工作项、CancellationToken令牌){
var tasks=workItems.Select(wi=>WorkItem(wi,token)).ToList();
等待任务。何时(任务);
}
这非常有效-问题是当检索到取消令牌时(对于服务结构关闭场景),代码应该很快取消-并且当您逐个取消任务时,您实际上会在进入异常抛出部分之前进入方法体-这在您有大量工作项时是一个问题

我在想类似的事情

var task = Task.Delay(Timeout.Infinite, token);
await Task.WhenAny(new List<Task> { task, Task.WhenAll(tasks) });
var task=task.Delay(Timeout.Infinite,token);
wait Task.WhenAny(新列表{Task,Task.WhenAll(tasks)});
一旦收到取消令牌,它实际上会快速完成该方法,但不能解决关机和新任务弹出的问题


我想合适的解决方案是某种分区器-任务是否有类似的分区器?

根据@nvoigt的建议,使用并行Linq解决方案相当简单。修改后的查询如下所示:

var tasks = workItems.AsParallel().WithCancellation(token).Select(wi => WorkItem(wi, token));
await Task.WhenAll(tasks);

然后它会更迅速地取消。

每当我看到要并行处理的事情列表时,我就会想到PLinq的
aspallel()
。你试过了吗?它可能比你自己的版本做得更好。您可以传递一个CancellationToken。@nvoigt-是否将其表述为答案?