gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:02:41 25 4
gpt4 key购买 nike

我遇到了这个例子,它演示了 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 个不同的内存位置,但序列仍然没有排序,我明白了原因,这与线程在迭代和启动 future 线程之前执行 Console.Write(temp) 的速度不是太快,我试图通过让主线程休眠来减慢循环,从而为每个线程提供时间以通过执行以下操作正确写入:

代码 3

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

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

最佳答案

came across this example that demonstrates the case of Captured Variables within a Thread and a loop

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

yet the sequence is still not ordered,

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

, is there a trick or a practice I'm missing here to show a complete correct sequence

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

关于c# - C#中循环中的线程捕获变量,如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26631939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com