C#线程问题

时间:2010-03-02 05:08:04

标签: c# multithreading

我正在尝试按如下方式简化问题,

  1. 我有大约100多个文件,我想阅读然后处理数据
  2. 我维护文件名和位置数组
  3. 我产生线程来完成阅读文件的工作。
  4. 现在我的问题是我想确保一次只生成5个线程,因为开始100 +线程根本不是好主意。

    所以请告诉我应该使用什么方法来确保只有5个线程正在工作,只要其中一个线程完成,就可以启动新线程。

    全心全意,

6 个答案:

答案 0 :(得分:4)

答案 1 :(得分:4)

我投票支持task parallel library / Rx(包含在.NET 4.0中,但可以下载3.5版):

        var options = new ParallelOptions();
        options.MaxDegreeOfParallelism = 5;

        Parallel.ForEach(GetListOFiles(), options, (file) =>
        {
             DoStuffWithFile(file);
        });

请注意,这将使用最多5个线程,但我看到它使用较少。

答案 2 :(得分:2)

将文件列表拆分为5个相同大小的列表。然后启动五个线程,并通过ParameterizedThreadStart传递每个单独的较小列表。

但是,由于工作几乎完全受I / O限制,因此该过程不太可能受益于线程。

答案 3 :(得分:2)

虽然这可能不会直接回答您的问题,但似乎producer-consumer design符合您的需求。此外,this可能有所帮助。

答案 4 :(得分:2)

我通常采用这种方法:

声明一个共享整数变量来表示工作线程的数量。 将作业分配给线程(只是将作业排入ThreadPool)时,请增加该值。当线程完成作业时,请减小该值。

确保整数值的递减或递增为原子。

在作业调度程序中,仅在工作线程数小于最大值时才获取作业并分配给线程。否则,等待信号(将由完成作业的工作线程触发)。如果您希望事件更简单,请让调度程序执行空循环以等待。

好处是最大值是可配置的,它利用了内置的ThreadPool的优势。编写消费者/生产者模型来解决这么小的问题是很昂贵的。

答案 5 :(得分:1)

通过ThreadPool进行处理,然后使用setMaxThreads

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.setmaxthreads.aspx