2

我遇到了这个示例,该示例演示了Captured Variableswithin aThread和 a loop 的情况:

代码 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

似乎该解决方案仅通过使用将创建 10 个不同内存位置的变量来消除冗余,但序列仍然没有排序,我理解原因,这与在迭代和启动之前temp线程执行速度不快有关Console.Write(temp)未来的线程,我试图通过睡眠主线程来减慢循环,让每个线程有时间通过​​执行以下操作正确写入:

代码 3

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

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

4

1 回答 1

3

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

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

然而序列仍然没有排序,

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

,有没有我在这里缺少的技巧或练习来显示完整的正确序列

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

于 2014-10-29T13:48:53.063 回答