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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Task.Factory.StartNew 和 Task.Factory.FromAsync 有什么区别?

發(fā)布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Task.Factory.StartNew 和 Task.Factory.FromAsync 有什么区别? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

咨詢區(qū)

  • soleiljy

假設(shè)我們有一個涉及IO操作的方法 (讀取數(shù)據(jù)庫),這個方法支持以同步或者異步的方式執(zhí)行。

  • 同步方式

  • IOMethod()

  • 異步方式

  • BeginIOMethod() ?EndIOMethod()

    接下來我都用 Task 來包裝這兩個方法。

    public?static?void?Main(){var?task1?=?Task.Factory.StartNew(()?=>?{?IOMethod();?});task1.Wait();var?task2?=?Task.Factory.FromAsync(BeginIOMethod,?EndIOMethod,?...?);task2.Wait();}

    從資源利用率這個角度看,它們到底有什么不同?

    回答區(qū)

    • svick

    我就從第一種說起吧。

    var?task?=?Task.Factory.StartNew(()?=>?{?IOMethod();?}); task.Wait();

    你這種寫法會阻塞兩個線程:

  • 調(diào)用線程

  • 這個很好理解,因為你用了 task.Wait() 這個阻塞版本。

  • 線程池線程

  • IOMethod 方法最終會被安排到線程池工作線程上,一直到該方法執(zhí)行完畢。

    接下來我們聊一下第二種方式:

    var?task?=?Task.Factory.FromAsync(BeginIOMethod,?EndIOMethod,?...?); task.Wait();

    這種寫法會阻塞一個線程

  • 調(diào)用線程

  • 這個很好理解,你用了 Wait() 方法。

    這里我有點疑惑,既然你都用了異步IO,為何還要用 Wait() 方法呢?可以將 Wait() 改成 await 關(guān)鍵詞,從而實現(xiàn) 0 阻塞,這不是更好嗎?比如下面這樣:

    var?task?=?Task.Factory.FromAsync(BeginIOMethod,?EndIOMethod,?...?); await?task;

    當然如果你的項目是 .NET 4.0 的話,可以用 ContinueWith 替代,同樣也可以實現(xiàn) 0 阻塞。

    var?task?=?Task.Factory.FromAsync(BeginIOMethod,?EndIOMethod,?...?); task.ContinueWith(()?=>?/*?rest?of?the?method?here?*/);

    點評區(qū)

    我感覺 svick 大佬介紹的非常到位,入木三分,如果再輔以 windbg 看看 threadpool 的情況會更好,學習了。

    總結(jié)

    以上是生活随笔為你收集整理的Task.Factory.StartNew 和 Task.Factory.FromAsync 有什么区别?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。