最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# winform多線程的小例子

 更新時(shí)間:2013年04月14日 10:37:52   作者:  
c# winform多線程的小例子,需要的朋友可以參考一下

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

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

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

為了便于在工作者線程中調(diào)用累加過程,我把它寫成一個(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é)作式取消,也就是說某一個(gè)操作必須支持取消,然后才能取消該操作);

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

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

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

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

我使用線程池線程來執(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)
        {

        }

    }
}

相關(guān)文章

  • C#實(shí)現(xiàn)事件總線的方法示例

    C#實(shí)現(xiàn)事件總線的方法示例

    事件總線是一種用于在應(yīng)用程序內(nèi)部或跨應(yīng)用程序組件之間進(jìn)行事件通信的機(jī)制,本文主要介紹了C#實(shí)現(xiàn)事件總線的方法示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • 解析C# Console 控制臺(tái)為什么也會(huì)卡死(原因分析)

    解析C# Console 控制臺(tái)為什么也會(huì)卡死(原因分析)

    在分析旅程中,總會(huì)有幾例控制臺(tái)的意外卡死導(dǎo)致的生產(chǎn)事故,有經(jīng)驗(yàn)的朋友都知道,控制臺(tái)卡死一般是動(dòng)了快速編輯窗口的緣故,雖然知道緣由,但一直沒有時(shí)間探究底層原理,市面上也沒有對(duì)這塊的底層原理介紹,昨天花了點(diǎn)時(shí)間簡(jiǎn)單探究了下,感興趣的朋友一起看看吧
    2023-10-10
  • C#手工雙緩沖技術(shù)用法實(shí)例分析

    C#手工雙緩沖技術(shù)用法實(shí)例分析

    這篇文章主要介紹了C#手工雙緩沖技術(shù)用法,實(shí)例分析了手工雙緩沖技術(shù)的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • C#獲取兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)示例

    C#獲取兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)示例

    本文介紹了使用C#獲取兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)的示例,大家參考使用吧
    2014-01-01
  • C#編程實(shí)現(xiàn)帶有Aero效果的窗體示例

    C#編程實(shí)現(xiàn)帶有Aero效果的窗體示例

    這篇文章主要介紹了C#編程實(shí)現(xiàn)帶有Aero效果的窗體,涉及C#調(diào)用動(dòng)態(tài)鏈接庫(kù)針對(duì)窗體屬性的相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • C#利用VS中插件打包并發(fā)布winfrom程序

    C#利用VS中插件打包并發(fā)布winfrom程序

    這篇文章主要為大家詳細(xì)介紹了C#利用VS中插件打包并發(fā)布winfrom程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • C# 開發(fā)(創(chuàng)藍(lán)253)手機(jī)短信驗(yàn)證碼接口的實(shí)例

    C# 開發(fā)(創(chuàng)藍(lán)253)手機(jī)短信驗(yàn)證碼接口的實(shí)例

    下面小編就為大家分享一篇C# 開發(fā)(創(chuàng)藍(lán)253)手機(jī)短信驗(yàn)證碼接口的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • C#中ValueTuple的原理詳解

    C#中ValueTuple的原理詳解

    C# 7.0已經(jīng)出來一段時(shí)間了,大家都知道新特性里面有個(gè)對(duì)元組的優(yōu)化:ValueTuple,下面這篇文章主要給大家介紹了關(guān)于C#中ValueTuple原理的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉和重啟計(jì)算機(jī)的示例代碼

    C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉和重啟計(jì)算機(jī)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉和重啟計(jì)算機(jī)的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • 通俗易懂的C#之反射教程

    通俗易懂的C#之反射教程

    這篇文章主要介紹了通俗易懂的C#之反射教程,本文深入分析了反射內(nèi)部的原理,剖析了內(nèi)部屬性、方法的運(yùn)作,并用通俗易懂的語(yǔ)言闡述,需要的朋友可以參考下
    2015-01-01

最新評(píng)論

江孜县| 布拖县| 茶陵县| 五峰| 汉源县| 江口县| 闵行区| 宜丰县| 乡城县| 延长县| 玛纳斯县| 万源市| 疏附县| 维西| 印江| 澄城县| 樟树市| 五河县| 武平县| 松江区| 永春县| 寿宁县| 富蕴县| 昂仁县| 偃师市| 西乌珠穆沁旗| 宜兰县| 丘北县| 华安县| 合水县| 县级市| 双流县| 南和县| 曲水县| 寿阳县| 名山县| 镇沅| 永新县| 晴隆县| 馆陶县| 武汉市|