a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > C# > 正文

c# winform多線程的小例子

2020-01-24 03:28:40
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在文本框中輸入一個(gè)數(shù)字,點(diǎn)擊開(kāi)始累加按鈕,程序計(jì)算從1開(kāi)始累計(jì)到該數(shù)字的結(jié)果。因?yàn)樵摾奂舆^(guò)程比較耗時(shí),如果直接在UI線程中進(jìn)行,那么當(dāng)前窗口將出現(xiàn)假死。為了有更好的用戶體驗(yàn),程序啟動(dòng)一個(gè)新的線程來(lái)單獨(dú)執(zhí)行該計(jì)算,然后每隔200毫秒讀取一次累加結(jié)果,并把結(jié)果顯示到文本框下方的label控件中。同時(shí),程序支持取消操作,點(diǎn)擊取消累計(jì)按鈕,程序?qū)⑷∠奂硬僮鳎旬?dāng)前累加值顯示到label中。為了方便后面的描述,我把UI線程稱作主線程,把執(zhí)行累加計(jì)算的線程稱作工作者線程。該過(guò)程有兩個(gè)關(guān)鍵點(diǎn):

1:如何在工作者線程中訪問(wèn)主線程創(chuàng)建的控件;

2:如何取消比較耗時(shí)的計(jì)算;

為了便于在工作者線程中調(diào)用累加過(guò)程,我把它寫(xiě)成一個(gè)單獨(dú)方法,如下:

復(fù)制代碼 代碼如下:

/// <summary>
        /// 從1累加到指定的值,為了讓該方法支持取消操作所以需要CancellationToken參數(shù)
        /// </summary>
        /// <param name="countTo">累加到的指定值</param>
        /// <param name="ct">取消憑證</param>
        private void CountTo(int countTo, CancellationToken ct) {
            int sum = 0;
            for (; countTo > 0; countTo--) {
                if (ct.IsCancellationRequested) {
                    break;
                }
                sum += countTo;
                //Invoke方法用于獲得創(chuàng)建lbl_Status的線程所在的上下文
                this.Invoke(new Action(()=>lbl_Status.Text = sum.ToString()));               
                Thread.Sleep(200);
            }
        }

該方法就是用于累加數(shù)字,它有兩個(gè)需要注意的地方

1:方法需要傳遞一個(gè)CancellationToken參數(shù),用于支持取消操作(《clr via c# 3版》中把這種方式稱作協(xié)作式取消,也就是說(shuō)某一個(gè)操作必須支持取消,然后才能取消該操作);

2:為了允許工作者線程訪問(wèn)主線程創(chuàng)建的lbl_Status控件,我在該線程中使用this.Invoke方法。該方法用于獲得主線程所創(chuàng)建控件的訪問(wèn)權(quán)。它需要一個(gè)委托作為參數(shù),在該委托中我們可以定義對(duì)lbl_Status的操作。例如在上例中我就是把當(dāng)前的累加結(jié)果賦給lbl_Status的Text屬性。

然后我們看一下如何在一個(gè)共走著線程中執(zhí)行計(jì)算耗時(shí)的操作,也就是“開(kāi)始累加”按鈕的操作:

復(fù)制代碼 代碼如下:

private void btn_Count_Click(object sender, EventArgs e)
        {
            _cts = new CancellationTokenSource();
            ThreadPool.QueueUserWorkItem(state=>CountTo(int.Parse(txt_CountTo.Text),_cts.Token));
        }

我使用線程池線程來(lái)執(zhí)行該操作,之所以使用線程池線程而不是自己的Threading對(duì)象,是因?yàn)榫€程池默認(rèn)已經(jīng)為我們創(chuàng)建好了一些線程,從而省去創(chuàng)建新線程造成的一些列資源消耗,同時(shí),完成計(jì)算任務(wù)后該線程池線程自動(dòng)回到池中等待下一個(gè)任務(wù)。我把_cts作為一個(gè)成員變量,聲明如下:

復(fù)制代碼 代碼如下:

private CancellationTokenSource _cts;

它需要引入using System.Threading;命名空間。

取消操作更加簡(jiǎn)單,代碼如下:

復(fù)制代碼 代碼如下:

private void btn_Cancel_Click(object sender, EventArgs e)
        {
            if (_cts != null)
                _cts.Cancel();
        }

這樣我們就完成了在winform中使用多線程的例子,同時(shí)該例子支持取消操作。完整代碼如下:

復(fù)制代碼 代碼如下:

using System;
using System.Threading;
using System.Windows.Forms;

namespace WinformApp
{
    public partial class Form1 : Form
    {
        private CancellationTokenSource _cts;
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 從1累加到指定的值,為了讓該方法支持取消操作所以需要CancellationToken參數(shù)
        /// </summary>
        /// <param name="countTo">累加到的指定值</param>
        /// <param name="ct">取消憑證</param>
        private void CountTo(int countTo, CancellationToken ct) {
            int sum = 0;
            for (; countTo > 0; countTo--) {
                if (ct.IsCancellationRequested) {
                    break;
                }
                sum += countTo;
                //Invoke方法用于獲得創(chuàng)建lbl_Status的線程所在的上下文
                this.Invoke(new Action(()=>lbl_Status.Text = sum.ToString()));

                Thread.Sleep(200);
            }
        }

        private void btn_Count_Click(object sender, EventArgs e)
        {
            _cts = new CancellationTokenSource();
            ThreadPool.QueueUserWorkItem(state=>CountTo(int.Parse(txt_CountTo.Text),_cts.Token));
        }

        private void btn_Cancel_Click(object sender, EventArgs e)
        {
            if (_cts != null)
                _cts.Cancel();
        }

        private void btn_Pause_Click(object sender, EventArgs e)
        {

        }

    }
}

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 韩国精品 | 在线观看a视频 | 国产午夜久久 | 一区二区欧美视频 | 日韩三区 | 爱爱免费视频网站 | 成人a视频在线观看 | 亚洲成人第一区 | 人人草人人看 | 91在线观看免费 | 欧美成人视屏 | 成人av一区二区三区 | 亚洲tv视频| 国产黄色免费 | 激情五月婷婷综合 | 蜜桃αv| 国产在线观看一区 | 在线观看日韩一区 | 国产一区二区三区视频观看 | 日韩成人综合 | 日本青草视频 | 91精品国产乱码久久久久久 | 亚洲国产精品成人 | 免费在线观看一区二区 | 国产精品视频免费 | 毛片大全 | 国产剧情一区二区 | 狠狠91| 国产精品久热 | 亚洲欧美中文日韩在线v日本 | 99精品国产高清一区二区麻豆 | 男女羞羞羞视频午夜视频 | 欧美日韩视频 | 精品久久久免费视频 | 中文字幕av亚洲精品一部二部 | 欧美极品一区 | 国产精品九九九 | 精品一二区 | 99re视频在线观看 | 成年无码av片在线 | 91视频分类 |