ThreadPool

1.循环列表,多线程执行
 List<Action> actions = new List<Action>();
actions.Add(() => Console.WriteLine("HH"));
actions.Add(() => Console.WriteLine("CC"));
actions.Add(() => Console.WriteLine("BB"));
//这样写不对。 因为threadpool是异步操作。相当于开了一个线程,把方法放在异步执行。
//会看到有重复的数据 。
foreach (var action1 in actions)
{
    ThreadPool.QueueUserWorkItem(state => action1(), null);
} 

1595906434857

要改为如下

//可以正常输出
  foreach (var action1 in actions)
  {
      var item = action1;
      ThreadPool.QueueUserWorkItem(state => item(), null);
  } 

1595906616249

Parallerl控制并行数量

列表中有多个用户。我只开启两个并行,new ParallelOptions(){MaxDegreeOfParallelism = 2

 Parallel.ForEach(relaList,new ParallelOptions(){MaxDegreeOfParallelism = 2}, x =>
                  {
                      try
                      {
                          CalcualteUser(true, DateTime.Now, x.RaceId, x.UserId, false);
                      }
                      catch (Exception ex)
                      {
                          LogUtility.WriteLog(string.Format("计算出现异常,跳过用户{0},原因:{1}....", x.UserId,ex.Message));

                      }

                  });

界面如下:

1595925391368

要区分异步和多线程的关系 ,多线程如果放在主线程上调用就会卡界面,一般要在异步中去执行。这样才不会卡界面 。


本文由 hcb 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论