各位大佬們,作業不忙或者晚上睡覺前沒事的話,可不可以幫我解釋一下異步的理論。什么是“未來完成時”,異步和多執行緒的區別。為什么異步不可以理解為,主執行緒執行到異步時,為異步代碼塊,開一個執行緒去執行,執行完畢后回到主執行緒。求大佬解釋一下啊。最好還有兩者區別的實體代碼,我會一個實體一個實體敲一遍的
uj5u.com熱心網友回復:
那就自己理解一下,為啥在15年前的你看的那些資料里回出現那么多的sleep 和那么多的有關執行緒同步的資料你為啥要sleep,你為啥要執行緒同步?因為我們不是就只做一件事情。我們需要的做的事情是,你做完了,后面的接著做
所以于其糾結什么區別,實體。
不妨自己考慮一下,如果你打算用傳統執行緒做這件事,你打算怎么去做“接著做”這樣的動作?很明顯,要么while(ture) sleep空跑輪詢檢查,要么另起一個執行緒等待同步信號量釋放,要么異步委托異步通知出去
我們其實不是考慮什么開一個執行緒,我們考慮的是接著把后續做下去
uj5u.com熱心網友回復:
很多人喜歡用做飯這件事,去講多執行緒,并行這樣的例子那好,我們說電飯煲回在他做好飯后“滴~滴~”的鳴叫,通知他做好了,等待你的后續處理。
對,一個執行緒不總是執行void,大多數情況下我們是要他的回傳狀態的,也就是你說的“未來他完成時的狀態”
uj5u.com熱心網友回復:
多執行緒是cpu有很多題要計算,但性能有限,頻率上不去了。把你的代碼,比如100道題目,分解成10份,每份10題,給10個執行緒去執行,反正現在cpu雖然頻率高不上去,核心還是很多的,這樣計算就快了。異步是cpu計算速度雖然上不去了,但比起哪些外部介面還是快了太多太多,網路訪問啦,磁盤讀寫啦,都很慢,如果你計算的時候需要從網路上拿一個資料,如果是同一個主執行緒在執行,那在等待的時候主執行緒就卡了,比如軟體界面上要顯示一個網路上的資料,網路卡,你的軟體就卡的拖都拖不動了,但其實你的cpu還閑死在哪兒,這時用異步,cpu遇到慢的事讓另外一個執行緒去干活,干完了告訴我就行,我就可以,即所謂未來完成時,在等回傳的時候干點別的,界面就不會卡了。
uj5u.com熱心網友回復:
我理解您的意思,可是我看到其他帖子說,不要把異步和多執行緒弄在一起談,可是如果實作的話,不就是程式主執行緒,遇到需要異步的代碼,再開一個執行緒去執行,然后主執行緒繼續執行下面的代碼,等異步代碼的那個執行緒執行完后回傳一個 Task<T>的狀態或是回傳值,后繼續嗎。可以這樣理解嗎。
uj5u.com熱心網友回復:
我遇到了對檔案讀寫的問題,然后同事跟我說,可以創建執行緒,然后執行 讀寫的時候,使執行緒sleep幾秒后,通過委托監視讀寫是否完成,但是這樣太復雜,邏輯關系也亂。雖然這個問題我使用異步解決了(百度c+v解決的),但是一直搞不清這個區別,以及具體是怎么實作的。
uj5u.com熱心網友回復:
說白了就是,我們要做的事情必須挨著做,沒做完不往下執行,但是我們還要保證界面不會被卡死。
uj5u.com熱心網友回復:
創建執行緒執行讀寫。主執行緒join子執行緒。
不需要sleep什么的。
===
概念上,異步是個廣泛的概念,多行程間并行,是異步;多執行緒并行,也是異步,主執行緒和ui執行緒的BeginInvoke呼叫,也是異步;await async關鍵字實作,也是異步;程式訪問資料庫,和資料庫程式也可以實作異步。等等。
但其實不管上面的各種方式,實作可能不同,但底層應該都和多執行緒/多行程有關。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/56945.html
標籤:C#
下一篇:基于C#地面站軟體
