在C#中的循环中捕获线程中的变量,解决方案是什么
本文关键字:变量 解决方案 线程 是什么 循环 | 更新日期: 2023-09-27 18:28:20
我看到了这个例子,它演示了Captured Variables
在Thread
和循环中的情况:
代码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#6IIRC中):C#将自动生成单独的值来捕获(因为这是您一直想要的)。
但是序列仍然没有排序,
当然不是。您无法控制线程的调度顺序。
,我在这里错过了展示完整正确序列的技巧或练习吗
您需要在线程完成时对结果进行重新排序,或者——如果处理量很小——不要使用线程。(在Win32上,线程的创建成本很高,只有当你要做实质性的工作时才能使用,即使这样,线程池或任务并行库TPL也是更好的选择。)