我有以下方法:为什么c#不保留匿名委托调用的上下文?
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的**值**。 – AakashM 2012-01-13 16:38:37
顺便提及,ReSharper的将发出警告关于[访问改性闭合](http://confluence.jetbrains.net/display/ReSharper/Access+to+modified+closure)时与此代码呈现;你可能会发现有帮助的解释。 – AakashM 2012-01-13 16:40:38
http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx – 2012-01-13 17:03:31