net Task多线程

85 阅读1分钟
  #region
  //多线程
  List<Task> tasks = new List<Task>();
  int maxTaskCount = 10;
  SemaphoreSlim semaphore = new SemaphoreSlim(maxTaskCount);
  for (var i = 0; i < lmv.Count; i++)
  {
      await semaphore.WaitAsync();
      int index = i; // 避免闭包捕获循环变量的问题
      string f = lmv[i];
      string name = lmv_name[i];
      var ctime = name.Split('_')[6].Split('-')[3].Split('.')[0];
      tasks.Add(Task.Run(async () =>
      {
          try
          {
              await ProcessFileAsync(f, name);
          }
          finally
          {
              semaphore.Release();
          }
      }));
      if (tasks.Count > maxTaskCount)
      {
          // 等待任何一个完成,不会阻塞当前线程
          await Task.WhenAny(tasks);
          // 排除掉已完成的任务
          tasks.RemoveAll(t => t.IsCompleted);
      }
  }
  // 等待所有任务完成
  await Task.WhenAll(tasks);
  #endregion