【发布时间】:2019-07-15 16:38:29
【问题描述】:
几乎每个 SO 对这个主题的回答都指出:
还有:
I recommend that you not think of this as "using async within LINQ"
但在斯蒂芬的书中有一个示例:
问题:你有一系列任务要等待,你想做一些 完成后对每个任务进行处理。但是,你想做 每一个的处理一旦完成,不等待 任何其他任务。
推荐的解决方案之一是:
static async Task<int> DelayAndReturnAsync(int val)
{
await Task.Delay(TimeSpan.FromSeconds(val));
return val;
}
// This method now prints "1", "2", and "3".
static async Task ProcessTasksAsync()
{
// Create a sequence of tasks.
Task<int> taskA = DelayAndReturnAsync(2);
Task<int> taskB = DelayAndReturnAsync(3);
Task<int> taskC = DelayAndReturnAsync(1);
var tasks = new[] { taskA, taskB, taskC };
var processingTasks = tasks.Select(async t =>
{
var result = await t;
Trace.WriteLine(result);
}).ToArray();
// Await all processing to complete
await Task.WhenAll(processingTasks);
}
问题 #1:
我不明白为什么现在 async 在 LINQ 语句中 - 确实有效。我们不是说“不要考虑在 LINQ 中使用async”吗?
问题 #2:
当控件到达这里的await t 时——实际发生了什么?控件是否离开ProcessTasksAsync 方法?还是离开匿名方法并继续迭代?
【问题讨论】:
-
“不要考虑......”的声明并不是必须的。您引用的所有文本都没有说异步不适用于 Linq - 只是它不是完美匹配。
-
Stephen Toub 的一本好书,如果您还没有读到:Tasks, Monads, and LINQ。
标签: c# .net asynchronous async-await task-parallel-library