我寫了一個單線程程序(的WinForms MEH)和我期待它的表現是這樣的:爲什麼沒有後臺工作人員不及時更新UI?
- 的MainForm開始進展顯示形式
- 進展的形式呈現完全
- 進展形式receieves事件operationStarted這增加一張轉圈圖片
- 長效手術開始
- 進度表接收事件操作完成或操作失敗並設置合適的圖像
會發生什麼是混亂。
- MainForm的進展開始顯示形式
- 進展形式不完全呈現!
- 計劃了一段時間
- 掛起當持久操作完成UI更新
爲什麼用更新的Windows窗體的滯後?
此減小的代碼,如果必要
private bool Run(int commandIndex, string fullCommand)
{
if (operationStarted != null)
operationStarted(commandIndex);
// start long lasting external process
if (exitCode != 0)
{
if (operationFailed != null)
operationFailed(commandIndex, Error);
return false;
}
if (operationCompleted != null)
operationCompleted(commandIndex);
return true;
}
operationStarted,operationFailed & operationCompleted被正確地設置,以更新相應的圖像。
您需要一個BackGroundWorker。你的_long_operations操作和UI一樣運行在同一個線程中,所以它阻塞了線程來阻止UI被刷新 – Pikoh
問題是你的程序一步接一步地工作,所以它開始顯示進度,之後甚至在它的渲染會啓動您的持久操作並關閉您的操作,完成後,它會返回以繼續顯示UI。你需要一個Backgroundworker,它可以在另一個線程上執行此操作 –