LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【C#】WinForm 解決窗體假死的狀態(tài) 非常有用!且非常重要!

admin
2025年7月25日 12:42 本文熱度 457

前言

在多核CPU越來越普及的時(shí)代,異步編程成為構(gòu)建高性能、可伸縮應(yīng)用程序的關(guān)鍵。通過使用少量的線程執(zhí)行大量操作,尤其是計(jì)算型和IO型任務(wù),我們能夠有效地提高應(yīng)用性能。然而,在獲取數(shù)據(jù)后將其綁定到UI中呈現(xiàn)時(shí),若數(shù)據(jù)量偏大,用戶可能會(huì)遭遇窗體“失去響應(yīng)”的糟糕體驗(yàn)。本文將探討如何正確使用異步調(diào)用來避免這種情況,并提供相應(yīng)的解決方案。

窗體阻塞的原因

窗體阻塞通常分為兩種情況:

一種是由于在UI線程上調(diào)用了耗時(shí)較長(zhǎng)的操作(如訪問數(shù)據(jù)庫(kù)),導(dǎo)致UI線程被占用;

另一種則是加載大批量數(shù)據(jù)至控件(如ListView、DataGridView)中,造成界面凍結(jié)。

本文主要討論第二種情況,并介紹如何利用異步編程技術(shù)來優(yōu)化用戶體驗(yàn)。

控件的線程安全檢測(cè)

在.NET Framework 2.0及后續(xù)版本中,System.Windows.Forms.Control新增了CheckForIllegalCrossThreadCalls屬性,用于標(biāo)記是否需要對(duì)非UI線程對(duì)控件的訪問進(jìn)行檢測(cè)。

如果設(shè)置為true,則當(dāng)從非UI線程訪問控件時(shí)會(huì)拋出異常;反之,則不捕獲此類錯(cuò)誤,允許程序繼續(xù)運(yùn)行。為了確保UI的安全性,CLR默認(rèn)不允許非UI線程直接訪問控件。

Control.Invoke與BeginInvoke

對(duì)于這兩個(gè)方法,需要注意的是它們雖然名稱暗示了異步特性,但實(shí)際上都是在UI線程上執(zhí)行代碼。

其中,Control.BeginInvoke相對(duì)于其調(diào)用線程而言是異步的,但對(duì)UI線程來說仍然是同步執(zhí)行。

因此,即使采用BeginInvoke,如果執(zhí)行了耗時(shí)操作,仍會(huì)導(dǎo)致UI線程阻塞。

體驗(yàn)BeginInvoke

下面的例子展示了如何使用BeginInvoke

private void btn_Start_Click(object sender, EventArgs e) {
    int curThreadID = Thread.CurrentThread.ManagedThreadId;
    
    new Thread(() => {
        PrintThreadLog(curThreadID);
    }).Start();
}

private void PrintThreadLog(int mainThreadID) {
    int asyncThreadID = Thread.CurrentThread.ManagedThreadId;
    
    label1.BeginInvoke((MethodInvoker)delegate() {
        int curThreadID = Thread.CurrentThread.ManagedThreadId;
        label1.Text = $"Async Thread ID:{asyncThreadID}, Current Thread ID:{curThreadID}, Is UI Thread:{curThreadID.Equals(mainThreadID)}";
    });
    
    Thread.Sleep(3000); // 模擬耗時(shí)操作
}

該示例說明了BeginInvoke中的代碼塊實(shí)際上是在UI線程上執(zhí)行的,而耗時(shí)操作則在工作線程上并行處理,從而不會(huì)影響UI響應(yīng)。

解決方案

針對(duì)大數(shù)據(jù)量加載導(dǎo)致的UI卡頓問題,可以采用異步方式逐條添加數(shù)據(jù)至控件中,并開啟雙緩沖以減少閃爍現(xiàn)象。

例如,使用自定義的DBListView控件實(shí)現(xiàn)如下:

public DBListView() {
    SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
}

然后通過異步線程逐步向DBListView中添加數(shù)據(jù)項(xiàng),避免一次性加載所有數(shù)據(jù)造成的界面凍結(jié)。

總結(jié)

無假死窗體演示

如何使用異步編程技巧使窗體在加載大量數(shù)據(jù)時(shí)保持響應(yīng)。

性能問題探討

異步加載帶來的性能損耗及其可能的解決方案。

最終方案實(shí)施

如何通過啟用雙緩沖機(jī)制有效減少控件刷新時(shí)的閃爍現(xiàn)象。

總結(jié)

本文深入講解了異步編程在Windows Forms應(yīng)用程序中的重要性,特別是如何避免因大量數(shù)據(jù)加載而導(dǎo)致的UI假死問題。

通過對(duì)Control.InvokeBeginInvoke的理解,以及合理運(yùn)用雙緩沖技術(shù),開發(fā)可以顯著提升應(yīng)用的用戶體驗(yàn)。希望讀者能從中獲得啟發(fā),應(yīng)用于自己的項(xiàng)目實(shí)踐中。

關(guān)鍵詞

#異步調(diào)用#CLR#UI線程#Control.Invoke、Control.BeginInvoke、#線程安全檢測(cè)#雙緩沖#性能優(yōu)化


閱讀原文:原文鏈接


該文章在 2025/7/25 14:49:11 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
伊人大蕉香中文字幕青青 | 亚洲动漫成人一区二区三区在线 | 亚洲变态另类天堂AV手机版 | 日本在线观看中文字二区 | 亚洲AⅤ鲁丝一区二区三区 日韩欧美综合一区二区 | 在线中文字幕亚洲日韩视频 |