【发布时间】:2012-01-13 16:30:39
【问题描述】:
我有以下方法:
static Random rr = new Random();
static void DoAction(Action a)
{
ThreadPool.QueueUserWorkItem(par =>
{
Thread.Sleep(rr.Next(200));
a.Invoke();
});
}
现在我在这样的 for 循环中调用它:
for (int i = 0; i < 10; i++)
{
var x = i;
DoAction(() =>
{
Console.WriteLine(i); // scenario 1
//Console.WriteLine(x); // scenario 2
});
}
在场景 1 中,输出为:10 10 10 10 ... 10
在场景 2 中,输出为:2 6 5 8 4 ... 0(0 到 9 的随机排列)
你怎么解释这个? c# 是否不应该为匿名委托调用保留变量(此处为 i)?
【问题讨论】:
-
但是保留('捕获')变量
i正是正在发生的事情! 没有发生,尽管您希望它发生,但在设置委托时保留i的 值。 -
顺便提一下,ReSharper 会在出现此代码时警告您 Access to modified closure;您可能会发现那里的解释很有帮助。
标签: c# .net multithreading c#-4.0 delegates