有人可以解释一下为什么这段代码无效:
...
foreach (VisualChunk chunk in SortedChunks)
{
System.Action a = () => MyFunction_Threaded(chunk);
Console.Write("Synchronous : ");
a.Invoke();
System.Threading.Tasks.Task.Factory.StartNew(
a,
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default)
}
...
private void MyFunction_Threaded(VisualChunk chunk)
{
Console.WriteLine(chunk.ChunkID);
}
它在控制台上给出了以下输出:
Synchronous : 0
Synchronous : 1
Synchronous : 2
Synchronous : 3
Synchronous : 4
Synchronous : 4294967291
Synchronous : 4294967292
Synchronous : 4294967293
Synchronous : 4294967294
Synchronous : 4294967295
Synchronous : 4294967296
Synchronous : 4294967297
4294967297
4294967297
4294967297
4294967297
4294967297
4294967297
4294967297
4294967297
4294967297
4294967297
4294967297
Synchronous : 4294967298
4294967298
事实上,当安装.net framework 4.5(win 8或VS2012)时,此代码运行正常。 当只安装4.0时,这个问题就出现了!
答案 0 :(得分:1)
是的,正如@usr上面的评论中所提到的,代码中的问题是你有“修改过的闭包”,编译器在构建汇编语言时有点误解了你想要做的事情。在c#语言中,这是一个非常糟糕的设计选择。要绕过它,你需要立即在循环中复制变量:
foreach (VisualChunk chunk in SortedChunks)
{
var chunkA = chunk;
System.Action a = () => MyFunction_Threaded(chunkA);
...
但是,我不得不问这是什么意思(即你想用这段代码完成什么)?