c#使用ThreadPool.QueueUserWorkItem时缺少某些线程作业

时间:2014-09-12 07:20:18

标签: c# threadpool

下面是这个问题的简单代码演示,只需几秒钟后执行StartQueueJob()然后执行ShowResult(), 在这里,我在几次测试后列出了一些测试结果:

  1. 循环次数:1000,计数:1000,线程数:999,Data.Count:999
  2. 循环次数:1000,对于计数:1000,线程数:990,Data.Count:992
  3. 循环次数:5000,数量:5000,线程数:4534,Data.Count:4527
  4. 循环次数:7,对于计数:7,线程数:7,Data.Count:7
  5. 循环次数:7,对于计数:7,线程数:6,Data.Count:6
  6. 在8核CPU Win7 64位PC,.NetFramework 4.0 VS2010 pro上进行了测试。单击鼠标触发函数,单击btn运行StartQueueJob(),然后单击几秒钟后运行ShowResult()。

    我有两个问题:

    1. 为什么有时线程计数!= Data.Count?

    2. 为什么有时线程计数<算数?

      List<int> Data = new List<int>();
      int ForCount = 0;
      int ThreadCount = 0;
      private void StartQueueJob( )
      {
          int iLoop = Convert.ToInt32(numericUpDown2.Value);
          Data = new List<int>(iLoop);
          ForCount = 0;
          ThreadCount = 0;
      
          for (int k = 0; k < iLoop; k++)
          {
              ForCount += 1;
      
              ThreadPool.QueueUserWorkItem(
              (obj) =>
              {
                  ThreadCount++;
                  Data.Add(ThreadCount);
              });
          }           
      }
      
      private void ShowResult()
      {
          Console.WriteLine(String.Format("Loop count: {3}, For count: {0}, Thread count: {1}, Data.Count: {2} ", new object[] { ForCount, ThreadCount, Data.Count, numericUpDown2.Value }));
      }
      

0 个答案:

没有答案