c# - 等待 QueueUserWorkItem 完成

标签 c# .net multithreading threadpool parallel-processing

如果我使用 QueueUserWorkItem 将作业添加到线程池...我如何在所有作业完成之前阻止我的程序继续运行?

我知道我可以添加一些逻辑来阻止应用程序运行,直到所有作业都完成,但我想知道是否有类似 Thread.Join() 的东西,或者是否有任何方法可以检索分配给作业的每个线程。

最佳答案

您可以使用事件进行同步。像这样:

private static ManualResetEvent resetEvent = new ManualResetEvent(false);

public static void Main()
{
    ThreadPool.QueueUserWorkItem(arg => DoWork());
    resetEvent.WaitOne();
}

public static void DoWork()
{
    Thread.Sleep(5000);
    resetEvent.Set();
}

如果您不想将事件集嵌入到您的方法中,您可以这样做:

var resetEvent = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(
    arg => 
    {
        DoWork();
        resetEvent.Set();
    });
resetEvent.WaitOne();

对于多个项目:

var events = new List<ManualResetEvent>();

foreach(var job in jobs)
{   
    var resetEvent = new ManualResetEvent(false);
    ThreadPool.QueueUserWorkItem(
        arg =>
        {
            DoWork(job);
            resetEvent.Set();
        });
    events.Add(resetEvent);
}
WaitHandle.WaitAll(events.ToArray());

关于c# - 等待 QueueUserWorkItem 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6529659/

相关文章:

java - 在远程服务中使用处理程序

c# - 数据绑定(bind)到 WPF TreeView 中的 SelectedItem

javascript - 类似于 document.ready 的事件可用作 Awesomium.Net 中 Bootstrap 问题的解决方法

c# - 非泛型类是否可能包含 .NET(C# 或 VB.NET)中的泛型列表?

mysql - EF DbContext 的 Linqpad 错误 : The type initializer for 'System.Data.Entity.Internal.AppConfig' threw an exception

javascript - 加密 (cryptojs) - 解密 (.NET)

Python 线程从队列获取项目 - 如何确定线程尚未调用 task_done()?

Json.NET 和 GC 等待的 C# 服务性能问题

c# - 在 NAudio 中录制时减少 channel 数

c# - WCF:远程服务器返回错误:(413)请求实体太大