常熟建设网站,做舞台灯光的在哪些网站接订单呢,加强专业建设的思路和建议,js网站开发工具咨询区 PedroC88如果我将 Job 通过 QueueUserWorkItem 方法丢到线程池的话#xff0c;请问我如何让程序在该 Job 完成后继续执行#xff0c;我知道可以添加一些逻辑代码来完成此项功能#xff0c;但我想知道有没有类似 Thread.Join() 或者怎么提取到被赋于 job 的线程 … 咨询区 PedroC88如果我将 Job 通过 QueueUserWorkItem 方法丢到线程池的话请问我如何让程序在该 Job 完成后继续执行我知道可以添加一些逻辑代码来完成此项功能但我想知道有没有类似 Thread.Join() 或者怎么提取到被赋于 job 的线程 回答区 Alex Aza你可以使用类似 ManualResetEvent 内核事件去同步参考下面代码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();
}如果不想把 event 嵌入到 方法中可以在 QueueUserWorkItem 委托方法中执行比如下面这样。var resetEvent new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(arg {DoWork();resetEvent.Set();});
resetEvent.WaitOne();对于批量操作可以定义一个 ListManualResetEvent 。var events new ListManualResetEvent();foreach(var job in jobs)
{ var resetEvent new ManualResetEvent(false);ThreadPool.QueueUserWorkItem(arg {DoWork(job);resetEvent.Set();});events.Add(resetEvent);
}
WaitHandle.WaitAll(events.ToArray());Brian Gideon可以用 CountdownEvent 或者 Barrier 来做同步。Barrier barrier new Barrier(3);
for(int i 0; i 2; i)
{ThreadPool.QueueUserWorkItem((state) {foo();barrier.SignalAndWait();}, null);
}
barrier.SignalAndWait();/* 或者*/using (var finished new CountdownEvent(1))
{foreach (var workitem in workitems){var capture workitem; // Used to capture the loop variable in the lambda expression.finished.AddCount(); // Indicate that there is another work item.ThreadPool.QueueUserWorkItem((state) {try{ProcessWorkItem(capture);}finally{finished.Signal(); // Signal that the work item is complete.}}, null);}finished.Signal(); // Signal that queueing is complete.finished.Wait(); // Wait for all work items to complete.
}点评区 如果一定要在 QueueUserWorkItem 中拦截最好的方式还是用各种锁比较好如果在实际开发中建议还是用 Task它具有强大的编排能力。