c# - 等待所有线程完成的有用模式是什么?

标签 c# visual-studio-2008 multithreading design-patterns .net-2.0

我有一个场景,我将不得不启动大量线程(可能多达 100 个),然后等待它们完成,然后执行任务(在另一个线程上)。

进行此类工作的公认模式是什么?只是.Join 吗?还是现在有更高层次的抽象?

在 VS2008 中使用 .NET 2.0。

最佳答案

在 .NET 3.5sp1 或 .NET 4 中,TPL会让这更容易。但是,我将仅针对 .NET 2 功能对其进行调整。

有几个选项。使用 Thread.Join 是完全可以接受的,尤其是当线程都是您手动创建的线程时。这非常容易、可靠且易于实现。这可能是我的选择。

但是,另一种选择是为总工作量创建一个计数器,并在计数器达到零时使用重置事件。例如:

class MyClass {
    int workToComplete; // Total number of elements
    ManualResetEvent mre; // For waiting

    void StartThreads()
    {
        this.workToComplete = 100;
        mre = new ManualResetEvent(false);

        int total = workToComplete;
        for(int i=0;i<total;++i)
        {
             Thread thread = new Thread( new ThreadStart(this.ThreadFunction) );
             thread.Start(); // Kick off the thread
        }

        mre.WaitOne(); // Will block until all work is done
    }

    void ThreadFunction()
    {
        // Do your work

        if (Interlocked.Decrement(ref this.workToComplete) == 0)
            this.mre.Set(); // Allow the main thread to continue here...
    }
}

关于c# - 等待所有线程完成的有用模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2291108/

相关文章:

visual-studio - Visual Studio 2008 宏在头文件和源文件之间切换?

c# - Entity Framework 模型浏览器显示存储过程两次

c# - 如何在 .Net 4.0 中将 DLR 与 MEF 一起使用?

c# - 如何使用 C# 在 MonoMac 中打开一个窗口作为模态对话框?

java - HashMap 顺序在使用 Thread 时发生变化,但在没有 Thread 时保持不变

multithreading - Delphi线程锁等待字符串操作

java - 了解 Java 中同步块(synchronized block)与 volatile 变量的原子性、可见性和重新排序

c# - 使用自定义组和小数分隔符将数字格式化为字符串而不更改精度

visual-studio-2008 - VC++ 2008/2010 能否在同一代码上轻松使用?

c++ - Visual Studio 无法 'see' 我包含的头文件