我們有一個桌面應用程序,在後臺線程中執行相當嚴格的一組計算。這個計算的部分是在我們通過互操作訪問的非託管庫中執行的。我們發現,當我們開始計算時,UI線程在計算期間變得沒有響應。我們的印象是框架將處理線程切換以允許UI繼續響應,但事實並非如此。我們發現我們可以插入一個Thread.Sleep(0)或Application.DoEvents()來允許UI響應。這有減緩計算的副作用。此外,由非託管代碼執行的部分計算可能需要長達30秒才能完成,並且在此期間應用程序始終無響應。整個計算可能需要兩到五分鐘才能完成。.NET線程模型和Application.DoEvents與Thread.Sleep
這導致以下問題:
- 什麼是關於用戶界面和互操作的.NET框架的線程模型?
- 我們在假定框架應該處理後臺和UI線程之間的線程切換時是否不正確?
- 在這種情況下使用Thread.Sleep和Application.DoEvents有什麼區別,並且比其他的優先?
注:非常古老的Q & A;尋找更新的討論,以獲得有關當前可用解決方案的良好答案。 – ToolmakerSteve 2018-03-03 21:55:58