在C#中的循环中使用ThreadPool

我不太熟悉线程,但下面的代码是可以接受的(我更担心在循环中使用线程池):

string[] filePaths = GetFilePaths();

      foreach (string filePath in filePaths )
      {
        ThreadPool.QueueUserWorkItem(DoStuff, filePath); 
      }

有没有其他办法可以做到这一点?

编辑:

注:每次执行DoStuff都会创建多个子线程(大约200个).这些子线程模拟系统的用户,仅负责通过TCP接收和发送信息.

当以下2个组合成立时,您当前的代码可能会出错:

>文件很多
>处理文件(DoStuff)需要很长时间

Threadpool没有足够的负载平衡功能,并且会继续创建越来越多的线程,超出最佳数量.

如果您可以使用Fx4,请使用TPL.

对于早期版本,请重写代码以使用更少的线程.

编辑,因为您使用的是Fx4:

您最大的收获可能来自使用System.Directory.EnumFiles()来替换Directory.GetFiles().

草图:

var files = System.Directory.EnumerateFiles(...);  // deferred execution

Parallel.ForEach(files, f => DoStuff(f));  // maybe use MaxDegree or CancelationToken

// all files done here

你也可以将这个.ForEach包装在(单个)try / catch等中.

如果DoStuff()需要并行性,你也应该使用TPL,也可以传递CancellationToken等.它会将所有Parallelism置于单个调度程序的控制之下.

您可能需要协助进行微调,但这也比没有TPL要容易得多.

相关文章
相关标签/搜索