LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

Winform-耗時操作導致界面渲染滯后

freeflydom
2025年2月7日 9:44 本文熱度 18

原因:
某些耗時操作阻塞了主線程。

理解上述原因,需先搞清楚Winform線程機制。主要有以下2點特性:1.單線程模型;2.依賴消息循環。
1.單線程模型
Winform 默認是單線程。通常,所有的UI操作,包括控件更新、事件處理,都由主線程管理(也就是UI線程)。
任何在事件處理程序中運行的代碼都會占用主線程。如果某個事件中有耗時很多的操作,就會阻塞線程。比如有時PictureBox.Image的顯示會滯后。
下面代碼中,pictureBox1的顯示會有滯后。背后的工作原理是:
“pictureBox1.Image = image0”運行完成后,系統只是將 pictureBox1 的 Image 屬性更新,但不會立即觸發控件繪制。(實際的繪制操作是由消息循環處理的,在 WM_PAINT 消息中完成)
pictureBox1的屬性設置之后,如果緊接著有耗時操作占用UI線程,就會導致WM_PAINT無法及時處理,所以不能及時繪制。
最佳解決辦法:
避免在 UI 線程執行耗時任務。將耗時任務移到后臺線程,可以確保 UI 線程始終空閑以處理消息循環,比如使用 Task.Run 或 async/await。

private void button2_Click(object sender, EventArgs e)
{
    using (var session = new InferenceSession(_modelPath))
    {
        ......  // 無關代碼
        Bitmap image0 = new Bitmap(_imagePath);
        pictureBox1.Image = image0;
        // 以下是某耗時操作
        DenseTensor<float> inputTensor = PreprocessImage(image0);
        ......
    }
}

補充一點:只有主線程可以訪問或更新控件;如果要從其他線程訪問、更新控件,要使用特定的線程間通訊,必須使用 Control.Invoke 或 Control.BeginInvoke 方法將操作封送到 UI 線程執行。如果在后臺線程中得到某個變量,需要渲染到主界面,就需要用到Control.Invoke等方法。

2.依賴消息循環
UI線程依賴消息循環(Message Loop)處理用戶輸入、標點擊等操作和系統消息。Application.Run 啟動時,UI線程進入消息循環狀態,不斷從消息隊列中提取消息并分發到對應控件處理。上述提到的線程阻塞實際上是阻塞了消息循環。

上述2個特性明白之后,就能理解原因中提到的阻塞了。如果不理解,可以嘗試在pictureBox1.Image之后跟隨一個簡單的耗時操作幫助理解。

轉自https://www.cnblogs.com/snowoct/p/18690950


該文章在 2025/2/7 9:44:38 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲影院午夜在线观看 | 久久久特色aⅴ片免费观看 午夜在线亚洲免费 | 久久久久久国产精选Av香蕉 | 日本高潮A级按摩中文片 | 在线一区视频二区三区 | 亚洲综合在线一区二区三区 |