c# - 有没有更好的方法来等待排队的线程?

标签 c# multithreading queue

有没有更好的方法在执行另一个进程之前等待排队的线程?

目前我在做:

this.workerLocker = new object(); // Global variable
this.RunningWorkers = arrayStrings.Length; // Global variable

// Initiate process

foreach (string someString in arrayStrings)
{
     ThreadPool.QueueUserWorkItem(this.DoSomething, someString);
     Thread.Sleep(100);
}

// Waiting execution for all queued threads
lock (this.workerLocker)  // Global variable (object)
{
     while (this.RunningWorkers > 0)
     {
          Monitor.Wait(this.workerLocker);
     }
}

// Do anything else    
Console.WriteLine("END");

// Method DoSomething() definition
public void DoSomething(object data)
{
    // Do a slow process...
    .
    .
    .

    lock (this.workerLocker)
    {
        this.RunningWorkers--;
        Monitor.Pulse(this.workerLocker);
    }
}

最佳答案

您可能想看看 AutoResetEvent 和 ManualResetEvent。

这些正是针对这种情况(在执行“某事”之前等待 ThreadPool 线程完成)。

你会做这样的事情:

static void Main(string[] args)
{
    List<ManualResetEvent> resetEvents = new List<ManualResetEvent>();
    foreach (var x in Enumerable.Range(1, WORKER_COUNT))
    {
        ManualResetEvent resetEvent = new ManualResetEvent();
        ThreadPool.QueueUserWorkItem(DoSomething, resetEvent);
        resetEvents.Add(resetEvent);
    }

    // wait for all ManualResetEvents
    WaitHandle.WaitAll(resetEvents.ToArray()); // You probably want to use an array instead of a List, a list was just easier for the example :-)
}

public static void DoSomething(object data)
{
    ManualResetEvent resetEvent = data as ManualResetEvent;

    // Do something

    resetEvent.Set();
}

编辑:忘记提及您可以等待单个线程、任何线程等等。 同样根据您的情况,AutoResetEvent 可以稍微简化一些事情,因为它(顾名思义)可以自动发出事件信号 :-)

关于c# - 有没有更好的方法来等待排队的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1045980/

相关文章:

c# - 使用 C# 发送电子邮件 - 不起作用,但没有抛出错误

c# - 如何使用后端 asp.net c# 的 Angular 网站读取其他网站数据

android - 在同一进程中运行的两个应用程序是否可以具有不同的 STATIC 对象值?

java - Android 中的进度对话框不显示?

java - 使用ArrayList(或更好的链接列表)编写自己的队列在技术上是否正确?[下面的java代码]

java - 如何在 Java 多线程消费者-生产者场景中了解应用程序是否已完成计算

c# - 如何在不打开 excel 文件的情况下将 excel 工作表复制到另一个 excel 工作簿中# winforms?

c# - Windows 窗体设计器对具有可为 null 属性的控件感到不安

c++ - 这种情况下有什么样的多线程保护?

C++:我应该通过数组实现堆栈/队列/双端队列以提高性能吗?