【发布时间】:2017-01-12 08:18:15
【问题描述】:
我有以下 -
for (int i = 0; i < N; ++i)
{
var firstTask = DoSomething(...);
var task = anotherTask.ContinueWith(
(t) => ProcessResult(i, t.Result));
}
问题是传递给 ProcessResult 的 i 的值似乎是它开始时的值,而不是迭代创建时的值。
防止这种情况的最佳方法是什么?
【问题讨论】:
-
你为什么用
ContinueWith而不是await?至于i,您的 lambda 捕获 variable 而不是变量的值。读取i将返回您实际读取它时包含的任何i- 当实际执行对ProcessResult(i,..)的调用时。顺便说一下,这是预期的行为。使用await将通过摆脱 lambda 来解决此问题并简化您的代码 -
链接任务。这些可以长时间运行,而 await 会暂停当前线程。
-
不,不会的。
await等待,它不会阻塞。它相当于ContinueWith,而不是Wait。它使链接 很多 变得更容易*,因为它不需要 lambda 和捕获。 -
无论如何,您可以将状态参数传递给
ContinueWith并在您的lambda 中访问它。这被await取代,并在 .NET 4.5 之后直接访问变量 -
谢谢。我是任务/等待的新手。我想我需要再读一遍。
标签: c# lambda async-await task