比方說,我有一個同步運行的方法fooCPU
(它不會調用執行I/O的純異步方法,或通過調用Task.Run
或類似的方法使用其他線程來運行其代碼)。該方法執行一些繁重的計算 - 它受CPU限制。UI線程有什麼特別之處?
現在我在我的程序中調用fooCPU
而不委託它由工作線程執行。如果一行fooCPU
將花費很長時間運行,那麼在完成之前不會執行其他行。例如,從UI線程調用它會導致UI線程凍結(GUI將變爲無響應)。
當我說async/await
是一個模仿多線程。兩條不同代碼的代碼在單個線程中輪流執行。如果其中一條線路需要很長時間才能運行,則不會執行其他線路,直至完成。,
我已經被告知在UI線程中使用async是正確的,但對於所有其他情況(ASP.NET,線程池上的異步,控制檯應用程序等)並非如此。
誰能告訴我這可能意味着什麼? UI線程與控制檯程序的主線程有何不同?
我認爲沒有人希望這個論壇上的任何人繼續討論相關主題,因爲它們出現在評論中,所以最好提出一個新問題。
我會在win窗體應用程序和控制檯應用程序上編譯相同的代碼,並使用ildasm或反射器檢查編譯的IL的差異以查看我自己。 –
@OguzOzgul這對許多問題很有用,但不是這個 - 代碼完全一樣。全局狀態有哪些變化 - 同步上下文的存在。 – Luaan
答案相當不錯,但唯一能滿足你好奇心的就是明白等待的細節。搜索「.net等待內部」看起來很不錯。如果你有一個小時的時間,這將會回答一切,我希望。 – usr