如果我使用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/

10-16 12:00