有沒有一種方法來處理需求每個結果?
就像註冊一個代表/回調當任務完成
是會得到執行,你只需要調整你的思考了一下。
忘記註冊回調(ContinueWith
is a dangerous, extremely low-level API)。另外,你幾乎從不需要完成任務。相反,根據操作(任務)考慮您的問題。
現在,您擁有一組返回TimeSpan
的任務。該集合中的每個項目都是一個返回TimeSpan
的單個操作。你真正想要做的是引入一個高級操作的概念,它等待原始操作完成,然後執行你的操作後邏輯。
這正是async
/await
是:
private static async Task<TimeSpan> HandleResultAsync(Task<TimeSpan> operation)
{
var result = await operation;
// A task has finished. This will get executed.
// result is of type TimeSpan
...
return result; // (assuming you want to propagate the result)
}
現在,你想這種更高級別的操作應用到您的現有業務。 LINQ的Select
非常適合這樣的:
IEnumerable<Task<TimeSpan>> tasks = ...
IEnumerable<Task<TimeSpan>> higherLevelTasks = tasks.Select(HandleResultAsync);
TimeSpan[] results = await Task.WhenAll(higherLevelTasks);
// By the time you get here, all results have been handled individually.
如果您不需要結果的最終集合,這可以進一步簡化:
private static async Task HandleResultAsync(Task<TimeSpan> operation)
{
var result = await operation;
// A task has finished. This will get executed.
// result is of type TimeSpan
...
}
IEnumerable<Task<TimeSpan>> tasks = ...
IEnumerable<Task> higherLevelTasks = tasks.Select(HandleResultAsync);
await Task.WhenAll(higherLevelTasks);
也許'任務[I] .ContinueWith()'? –