亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c# winform多線程的小例子

2020-01-24 03:28:40
字體:
來源:轉載
供稿:網友

在文本框中輸入一個數字,點擊開始累加按鈕,程序計算從1開始累計到該數字的結果。因為該累加過程比較耗時,如果直接在UI線程中進行,那么當前窗口將出現假死。為了有更好的用戶體驗,程序啟動一個新的線程來單獨執行該計算,然后每隔200毫秒讀取一次累加結果,并把結果顯示到文本框下方的label控件中。同時,程序支持取消操作,點擊取消累計按鈕,程序將取消累加操作,并把當前累加值顯示到label中。為了方便后面的描述,我把UI線程稱作主線程,把執行累加計算的線程稱作工作者線程。該過程有兩個關鍵點:

1:如何在工作者線程中訪問主線程創建的控件;

2:如何取消比較耗時的計算;

為了便于在工作者線程中調用累加過程,我把它寫成一個單獨方法,如下:

復制代碼 代碼如下:

/// <summary>
        /// 從1累加到指定的值,為了讓該方法支持取消操作所以需要CancellationToken參數
        /// </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方法用于獲得創建lbl_Status的線程所在的上下文
                this.Invoke(new Action(()=>lbl_Status.Text = sum.ToString()));               
                Thread.Sleep(200);
            }
        }

該方法就是用于累加數字,它有兩個需要注意的地方

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

2:為了允許工作者線程訪問主線程創建的lbl_Status控件,我在該線程中使用this.Invoke方法。該方法用于獲得主線程所創建控件的訪問權。它需要一個委托作為參數,在該委托中我們可以定義對lbl_Status的操作。例如在上例中我就是把當前的累加結果賦給lbl_Status的Text屬性。

然后我們看一下如何在一個共走著線程中執行計算耗時的操作,也就是“開始累加”按鈕的操作:

復制代碼 代碼如下:

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

我使用線程池線程來執行該操作,之所以使用線程池線程而不是自己的Threading對象,是因為線程池默認已經為我們創建好了一些線程,從而省去創建新線程造成的一些列資源消耗,同時,完成計算任務后該線程池線程自動回到池中等待下一個任務。我把_cts作為一個成員變量,聲明如下:

復制代碼 代碼如下:

private CancellationTokenSource _cts;

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

取消操作更加簡單,代碼如下:

復制代碼 代碼如下:

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

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

復制代碼 代碼如下:

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參數
        /// </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方法用于獲得創建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)
        {

        }

    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美另类极品videosbestfree| 欧美激情在线观看| 成人福利免费观看| 色婷婷综合成人av| 国产精品偷伦免费视频观看的| 欧美视频在线观看免费网址| 久久影视三级福利片| 日本免费久久高清视频| 久久色免费在线视频| 在线视频欧美日韩| 日韩美女在线看| 91精品中文在线| 91啪国产在线| 国产欧美一区二区三区在线| 亚洲一区二区三区久久| 久久精品91久久香蕉加勒比| 国产91精品不卡视频| 日韩精品在线观看网站| 国产日本欧美一区二区三区在线| 91在线中文字幕| 国内外成人免费激情在线视频| 亚洲视频axxx| 日韩av综合网站| 激情懂色av一区av二区av| 91久久精品美女| 亚洲国产私拍精品国模在线观看| 日韩日本欧美亚洲| 欧美剧在线观看| 亚洲第一区第二区| 国产最新精品视频| 精品久久久久久亚洲国产300| 欧美成人三级视频网站| 成人欧美一区二区三区黑人| 欧美在线观看一区二区三区| 日韩性xxxx爱| 亚洲国产女人aaa毛片在线| 精品久久久久久| 国产精品mp4| 国产精品电影网| 亚洲免费电影在线观看| 国色天香2019中文字幕在线观看| 91精品在线观看视频| 国产日韩中文字幕| 91精品国产91久久久久久吃药| 中国人与牲禽动交精品| 欧美插天视频在线播放| 国产一区红桃视频| 日韩精品在线影院| 中文字幕亚洲欧美日韩高清| 精品久久久久久久久久久久久久| 中文字幕免费精品一区| 国产成+人+综合+亚洲欧洲| 国产精品久久久久久久久久久久久久| 九九热精品在线| 亚洲欧美日韩高清| 欧美电影电视剧在线观看| 亚洲人成电影在线播放| 一区二区在线免费视频| 91精品国产综合久久久久久久久| 欧美情侣性视频| 欧美在线www| 久久久免费精品视频| 中文字幕日韩av电影| 国产精品777| 7777精品久久久久久| 九九视频这里只有精品| 在线精品视频视频中文字幕| 欧美精品电影在线| 久久激情视频免费观看| 色综合视频一区中文字幕| 日韩色av导航| 亚洲xxxxx| 国产激情999| 97精品视频在线播放| 亚洲视频日韩精品| 久久亚洲欧美日韩精品专区| 成人妇女淫片aaaa视频| 久久影视电视剧免费网站清宫辞电视| 国产精品日本精品| 久久久久久亚洲精品不卡| 亚洲成人黄色网| 伊人久久免费视频| 欧美日韩亚洲一区二区三区| 日韩av一区二区在线观看| 日产精品久久久一区二区福利| 日本高清不卡的在线| 国产一区二区三区精品久久久| 一区二区三区四区在线观看视频| 国产日韩综合一区二区性色av| 欧美日韩一区二区免费视频| 亚洲欧美综合区自拍另类| 国产精品美女视频网站| 欧美另类xxx| 91九色精品视频| 欧洲日本亚洲国产区| 精品国产999| 亚洲老司机av| 国产精品福利小视频| 亚洲欧美日韩中文视频| 久久躁狠狠躁夜夜爽| 成人免费网站在线| 亚洲视频国产视频| 欧美xxxx18国产| 精品久久久久久久久久久| 欧美日韩国产成人高清视频| 国产视频自拍一区| 久久久久北条麻妃免费看| 中文字幕日本欧美| 91精品国产777在线观看| 久久精品小视频| 国产成人精品一区| 亚洲欧美在线第一页| 亚洲天堂影视av| 亚洲xxxx妇黄裸体| 国模gogo一区二区大胆私拍| 尤物99国产成人精品视频| 日韩中文字幕网址| 日韩在线观看网站| 欧美精品在线播放| 亚洲天堂av在线免费观看| 亚洲大胆人体视频| 亚洲a成v人在线观看| 亚洲激情小视频| 国产精品激情自拍| 亚洲片在线观看| 38少妇精品导航| 日韩欧美大尺度| 欧美亚洲国产视频小说| 国产精品一区二区三区在线播放| 国产欧美日韩高清| 国产一区二区三区直播精品电影| 这里只有精品视频在线| 日韩欧美中文在线| 国产精品久久久久久亚洲影视| 日韩电影免费观看中文字幕| 成人激情综合网| 久久av红桃一区二区小说| 久久人人爽人人爽人人片av高清| 欧美激情a在线| 日韩在线观看免费全集电视剧网站| 亚洲自拍欧美另类| 日韩精品免费在线| 成人免费福利视频| 在线看日韩av| 亚洲最新av在线网站| 一区二区三区视频免费在线观看| 日韩av最新在线观看| 久久6免费高清热精品| 黑人极品videos精品欧美裸| 久久99久国产精品黄毛片入口| 国产丝袜一区视频在线观看| 91免费看片在线| 国产亚洲精品一区二区| 精品成人av一区| 国产精品视频播放| 人体精品一二三区| 久久精品99无色码中文字幕| 亚洲成人网在线| 欧美成人精品xxx| 久久久久久久一区二区| 正在播放欧美一区| 日韩电影第一页| 久久久久成人网| 高清欧美性猛交xxxx黑人猛交|