日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何实现线程池的 QueueUserWorkItem 方法的延续?

發布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何实现线程池的 QueueUserWorkItem 方法的延续? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

咨詢區

  • 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();

對于批量操作,可以定義一個 List<ManualResetEvent> 。

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());
  • 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,它具有強大的編排能力。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的如何实现线程池的 QueueUserWorkItem 方法的延续?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。