在C#中的循环中捕获线程中的变量,解决方案是什么

本文关键字:变量 解决方案 线程 是什么 循环 | 更新日期: 2023-09-27 18:28:20

我看到了这个例子,它演示了Captured VariablesThread和循环中的情况:

代码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)的速度不太快有关,我试图通过睡眠主线程来减慢循环速度,给每个线程留出时间来正确地写:

代码3

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

它解决了问题,但当涉及到真实场景时,我不认为这是一个真正的解决方案,我在这里缺少了一个技巧或实践来展示像0123456789这样的完整正确序列吗?

在C#中的循环中捕获线程中的变量,解决方案是什么

遇到了这个例子,它演示了在线程和循环中捕获变量的情况

注意,C#将有一个功能变化(在C#6IIRC中):C#将自动生成单独的值来捕获(因为这是您一直想要的)。

但是序列仍然没有排序,

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

,我在这里错过了展示完整正确序列的技巧或练习吗

您需要在线程完成时对结果进行重新排序,或者——如果处理量很小——不要使用线程。(在Win32上,线程的创建成本很高,只有当你要做实质性的工作时才能使用,即使这样,线程池或任务并行库TPL也是更好的选择。)