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

c# winform多線程的小例子

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

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

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

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

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

復制代碼 代碼如下:

/// <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ù)字,它有兩個需要注意的地方

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

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

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

復制代碼 代碼如下:

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對象,是因為線程池默認已經(jīng)為我們創(chuàng)建好了一些線程,從而省去創(chuàng)建新線程造成的一些列資源消耗,同時,完成計算任務后該線程池線程自動回到池中等待下一個任務。我把_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參數(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#實現(xiàn)事件總線的方法示例

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

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

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

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

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

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

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

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

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

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

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

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

    C# 開發(fā)(創(chuàng)藍253)手機短信驗證碼接口的實例

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

    C#中ValueTuple的原理詳解

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

    C#實現(xiàn)遠程關(guān)閉和重啟計算機的示例代碼

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

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

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

最新評論

汕尾市| 乾安县| 宣化县| 育儿| 巨鹿县| 阿图什市| 西峡县| 贵南县| 鄯善县| 永安市| 剑川县| 阜平县| 康马县| 西林县| 乐昌市| 古蔺县| 上高县| 茂名市| 永安市| 龙井市| 金川县| 三门峡市| 桐乡市| 大同市| 石泉县| 宜宾县| 浦北县| 湘阴县| 屏边| 文山县| 郸城县| 荃湾区| 宁陵县| 贵德县| 霍州市| 聂荣县| 二手房| 烟台市| 大方县| 岚皋县| 前郭尔|