日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

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

C#--耗時操作實現UI界面實時更新不阻塞(耗時操作解決窗體卡頓)

admin
2024年11月27日 18:53 本文熱度 1411

前言

C#實現窗體加載進度條或者百分比實時顯示耗時操作的進度,方法有很多。但是經過我的學習、查找與實際應用,發現Task配合MethodInvoker最為高效便捷。下面我就來結合代碼講一下要注意的問題。


基礎知識

C#在winform上進行耗時操作往往會放置progressbar,問題是在UI線程上進行耗時操作就會導致UI線程阻塞,界面就會卡頓。所以勢必要另開一個線程進行耗時操作,之后將耗時操作的過程實時反饋給UI線程即可,可問題是新開的線程向UI線程傳遞數據的時候,就會出現經典報錯:

InvalidOperationException,并提示消息:“從不是創建控件的線程訪問它。

這是因為NET原則上禁止跨線程訪問。因為這樣可能造成錯誤的發生,有一種簡單粗暴的方法是禁止編譯器對跨線程訪問作檢查,Control.CheckForIllegalCrossThreadCalls = false;可以實現訪問,但是什么時候出錯不敢保證。

Task

Task是一個升級版本的Thread的類,它非常的靈活,支持取消、阻塞等待、合并、多個Task協同操作......。總之使用Task編碼高效易懂,你基本不用去研究Thread與ThreadPool了,雖然本質上還是這個。我個人理解Task就是對Thread的再次封裝。

MethodInvoker

MethodInvoker 是位于System.Windows.Forms下的元數據,表示一個委托,該委托可以執行托管代碼中聲明為void且不接受任何參數的任何方法。在對控件的 invoke 方法進行調用時或需要一個簡單委托又不想自己定義時可以使用該委托。 我是這樣理解的,在新線程中使用 MethodInvoker 委托執行耗時操作, 其實相當于是在主線程中執行的,這樣就避免了跨線程訪問控件。


示例代碼

private void button1_Click(object sender, EventArgs e)

{

    progressBar1.Visible = true;

    Task task = new Task(() =>

    {

        int i = 0;

        while (++i < 100)

        {

            Thread.Sleep(10);//模擬耗時操作

            MethodInvoker mi = new MethodInvoker(() =>

            {

                progressBar1.Value = i;

                this.label1.Text = i.ToString();

            });

            this.BeginInvoke(mi);

        }

    });

    task.Start();

    task.ContinueWith(t => {

        progressBar1.Visible = false;

    },TaskScheduler.FromCurrentSynchronizationContext());

}?

線程的延續采用ContinueWith解決

BeginInvoke解決界面的刷新問題

TaskScheduler.FromCurrentSynchronizationContext() 解決跨線程訪問報錯

private void button2_Click(object sender, EventArgs e)

{

    Task task1 = new Task(() =>

    {

        M1();

        MethodInvoker mi = new MethodInvoker(() =>

        {

            this.label1.Text = "1";

        });

        this.BeginInvoke(mi);

        M2();

        mi = new MethodInvoker(() =>

        {

            this.label1.Text = "2";

        });

        this.BeginInvoke(mi);

    });

    task1.Start();

    this.label1.Text="主線程開始運行!" ;

}

private void M1()

{

    Thread.Sleep(2000);

}

private void M2()

{

    Thread.Sleep(1000);

}

button2的方式可以在task線程中按順序執行耗時操作。


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

主站蜘蛛池模板: 免费看黑人 | 中文字幕不卡精 | 国产在线视频不卡一区二区 | 国产偷v国产偷v | 一级大片网站 | 亚洲欧美综合高清在线 | 精品国产不卡在线观看免费 | 日本国产中文字幕 | 国产福利一区二区久 | 国产美女淫秽一区二区三区 | 国产一区二区不卡视频 | 国产亚洲精品aa在线观看 | 亚洲精品日韩精品一区 | 中文字幕精品二区 | 国内自拍视频一区二区三区 | 人成视频在线观看国产 | 色戒在线完整 | 国产亚洲蜜 | 欧美精品另类 | 羞羞影院午夜男女爽爽视频免费 | 国产欧美日本韩国另类 | 最新天美传媒 | 欧美精品一区二区男同专区 | 免费高清国产 | 丫头13第一次真紧 | 亚洲精品vs中文字幕白桨 | 国产高清视频一区免费观看 | 成人啪精品视频网站午夜 | 欧美日韩激情 | 国产极品翘臀在线观看 | 亚洲综合精品 | 欧美一卡2卡3卡4卡新区 | 亚洲国产一区二区三区综合片 | 国产精品自在线拍国产下载 | 国产一级高 | 精品一区卡2卡3卡 | 国在线视频 | 国产高清在线丝袜精品一区 | 91拍拍在线观看 | 97韩剧| 色吊丝中文字幕一区二区三区 |