线程订单执行?

Roy*_*mir 5 .net c# clr multithreading .net-4.0

我有这个简单的代码:( 我在linqpad中运行)

void Main()
{
    for ( int  i=0;i<10;i++)
     {
      int  tmp=i;
      new Thread (() =>doWork(tmp)).Start();
     }
}

 public void doWork( int h)
 {
 h.Dump();
 }
Run Code Online (Sandbox Code Playgroud)

int tmp=i;行用于捕获变量 - 因此每次迭代都有自己的值.

2个问题:

1)数字不是顺序的,而线程执行是!

2)有时我得到的数字少于 10个!

这里有一些执行输出:

在此输入图像描述在此输入图像描述在此输入图像描述在此输入图像描述

问题:

1)为什么案例1正在发生,我该如何解决?

2)为什么案例2正在发生,我该如何解决?

Mar*_*ell 8

不应期望它们是连续的.每个线程都会在内核选择时获得优先级.可能会发生这样的情况,它们看起来是连续的,完全取决于每个开始时的性质,但这只是纯粹的机会.

为了确保它们都完整 - 将每个新线程标记为IsBackground = false,以便使可执行文件保持活动状态.例如:

new Thread(() => doWork(tmp)) { IsBackground = false }.Start();
Run Code Online (Sandbox Code Playgroud)

  • 如果订单很重要,请按顺序执行.如果订单不重要,请将它们分配给一堆线程. (2认同)
  • @RoyiNamir并行的全部意义是*同时*做事情*.这是**没有订购**.另外:请注意,在大多数*真实*使用线程中,你不会为这样的小工作单元创建一个`Thread`.使用`ThreadPool`或4.0中的TPL (2认同)
  • @Royi:`Sleep`不能保证任何内容:如果内核可能会无限期地阻塞该线程. (2认同)