繁体   English   中英

具有Action()委托的任务并行库

[英]Task Parallel Library with Action() delegate

有人可以解释一下为什么这段代码不起作用:

...
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,则会出现此问题!

是的,正如@usr在上面的注释中提到的那样,代码中的问题是您具有“修改后的闭包”,在这种情况下,编译器在构建汇编语言时会误解您要执行的操作。 在c#语言中,这是一个非常糟糕的设计选择。 为了解决这个问题,您需要立即在循环中复制变量:

foreach (VisualChunk chunk in SortedChunks)
{
  var chunkA = chunk;
  System.Action a = () => MyFunction_Threaded(chunkA);
  ...

但是,我不得不问这是什么意思(即,您打算用这段代码完成什么)?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM