繁体   English   中英

在C#中循环中的线程中捕获的变量,如何解决?

[英]Captured variables in a thread in a loop in C#, what is the solution?

我遇到了这个示例,该示例演示了Thread和循环中Captured Variables的情况:

代码1

for (int i = 0; i < 10; i++)
{
   new Thread(() => Console.Write(i)).Start();
}

结果1

0223558779

据说建议的解决方案正在创建一个临时变量,如下所示:

代码2

for (int j = 0; j < 10; j++)
{
    int temp = j;
    new Thread(() => Console.Write(temp)).Start();
}

结果2

0124356879

看来,该解决方案仅通过使用temp变量来消除冗余,该变量将创建10个不同的内存位置,但是该序列仍未排序,我明白原因,这与线程执行Console.Write(temp)速度不太快有关Console.Write(temp)在迭代和启动将来的线程之前,我试图通过休眠主线程来给循环分配时间来使每个线程有时间正确写入,从而减慢循环速度:

代码3

for (int i = 0; i < 10; i++)
{
   new Thread(() => Console.Write(i)).Start();
   Thread.Sleep(10);   
}

它解决了问题,但是在实际场景中,我认为这不是真正的解决方案,在这里我是否缺少技巧或实践来显示完整正确的序列(如0123456789

遇到了这个示例,该示例演示了线程和循环内捕获变量的情况

注意C#将进行功能更改(在C#6 IIRC中):C#将自动生成单独的值进行捕获(因为这就是您一直想要的)。

仍然没有顺序

当然不是。 您无法控制线程的调度顺序。

,有没有我想在这里显示完整正确序列的技巧或实践?

您需要在线程完成时重新排列结果的顺序,或者-如果处理量很小-请勿使用线程。 (在Win32上,线程创建起来非常昂贵,仅在您要进行实质性工作时才使用,即使线程池或任务并行库TPL是更好的选择)。

暂无
暂无

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

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