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

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

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

前言

C#實(shí)現(xiàn)窗體加載進(jìn)度條或者百分比實(shí)時(shí)顯示耗時(shí)操作的進(jìn)度,方法有很多。但是經(jīng)過(guò)我的學(xué)習(xí)、查找與實(shí)際應(yīng)用,發(fā)現(xiàn)Task配合MethodInvoker最為高效便捷。下面我就來(lái)結(jié)合代碼講一下要注意的問(wèn)題。


基礎(chǔ)知識(shí)

C#在winform上進(jìn)行耗時(shí)操作往往會(huì)放置progressbar,問(wèn)題是在UI線(xiàn)程上進(jìn)行耗時(shí)操作就會(huì)導(dǎo)致UI線(xiàn)程阻塞,界面就會(huì)卡頓。所以勢(shì)必要另開(kāi)一個(gè)線(xiàn)程進(jìn)行耗時(shí)操作,之后將耗時(shí)操作的過(guò)程實(shí)時(shí)反饋給UI線(xiàn)程即可,可問(wèn)題是新開(kāi)的線(xiàn)程向UI線(xiàn)程傳遞數(shù)據(jù)的時(shí)候,就會(huì)出現(xiàn)經(jīng)典報(bào)錯(cuò):

InvalidOperationException,并提示消息:“從不是創(chuàng)建控件的線(xiàn)程訪(fǎng)問(wèn)它。

這是因?yàn)镹ET原則上禁止跨線(xiàn)程訪(fǎng)問(wèn)。因?yàn)檫@樣可能造成錯(cuò)誤的發(fā)生,有一種簡(jiǎn)單粗暴的方法是禁止編譯器對(duì)跨線(xiàn)程訪(fǎng)問(wèn)作檢查,Control.CheckForIllegalCrossThreadCalls = false;可以實(shí)現(xiàn)訪(fǎng)問(wèn),但是什么時(shí)候出錯(cuò)不敢保證。

Task

Task是一個(gè)升級(jí)版本的Thread的類(lèi),它非常的靈活,支持取消、阻塞等待、合并、多個(gè)Task協(xié)同操作......??傊褂肨ask編碼高效易懂,你基本不用去研究Thread與ThreadPool了,雖然本質(zhì)上還是這個(gè)。我個(gè)人理解Task就是對(duì)Thread的再次封裝。

MethodInvoker

MethodInvoker 是位于System.Windows.Forms下的元數(shù)據(jù),表示一個(gè)委托,該委托可以執(zhí)行托管代碼中聲明為void且不接受任何參數(shù)的任何方法。在對(duì)控件的 invoke 方法進(jìn)行調(diào)用時(shí)或需要一個(gè)簡(jiǎn)單委托又不想自己定義時(shí)可以使用該委托。 我是這樣理解的,在新線(xiàn)程中使用 MethodInvoker 委托執(zhí)行耗時(shí)操作, 其實(shí)相當(dāng)于是在主線(xiàn)程中執(zhí)行的,這樣就避免了跨線(xiàn)程訪(fǎng)問(wèn)控件。


示例代碼

private void button1_Click(object sender, EventArgs e)

{

    progressBar1.Visible = true;

    Task task = new Task(() =>

    {

        int i = 0;

        while (++i < 100)

        {

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

            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());

}?

線(xiàn)程的延續(xù)采用ContinueWith解決

BeginInvoke解決界面的刷新問(wèn)題

TaskScheduler.FromCurrentSynchronizationContext() 解決跨線(xiàn)程訪(fǎng)問(wèn)報(bào)錯(cuò)

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="主線(xiàn)程開(kāi)始運(yùn)行!" ;

}

private void M1()

{

    Thread.Sleep(2000);

}

private void M2()

{

    Thread.Sleep(1000);

}

button2的方式可以在task線(xiàn)程中按順序執(zhí)行耗時(shí)操作。


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

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲国产综合精品视频 | 日韩精品92午夜福利免视频 | 一级少妇高清在线 | 亚洲无线国产观看原创 | 中文字幕一区二区三区日韩精品 | 亚洲人在线观看视频 |