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

winform多線程組件BackgroundWorker使用

 更新時間:2022年05月11日 11:24:14   作者:springsnow  
這篇文章介紹了winform多線程組件BackgroundWorker的使用方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

BackgroundWorker是·net里用來執(zhí)行多線程任務的控件,它允許編程者在一個單獨的線程上執(zhí)行一些操作。

可以通過編程方式創(chuàng)建 BackgroundWorker,也可以將它從“工具箱”的“組件”選項卡中拖到窗體上。 如果在 Windows 窗體設計器中創(chuàng)建 BackgroundWorker,則它會出現(xiàn)在組件欄中,而且它的屬性會顯示在“屬性”窗口中。

常用方法

  • RunWorkerAsync 開始執(zhí)行后臺操作。引發(fā) DoWork 事件。
       public void RunWorkerAsync(); //啟動線程,觸發(fā)DoWork事件
       public void RunWorkerAsync(object argument);
  • CancelAsync 請求取消掛起的后臺操作。
    注意:這個方法是將 CancellationPending 屬性設置為 true,并不會終止后臺操作。在后臺操作中要檢查CancellationPending 屬性,來決定是否要繼續(xù)執(zhí)行耗時的操作。
  • ReportProgress引發(fā) ProgressChanged 事件。
       public void ReportProgress(int percentProgress); //報告進度,觸發(fā)ProgressChanged事件
       public void ReportProgress(int percentProgress, object userState);

常用屬性

  • IsBusy:  //只讀屬性,用來判斷當前線程是否正在工作中。
  • CancellationPending: 指示應用程序是否已請求取消后臺操作。只讀屬性,默認為 false,當執(zhí)行了 CancelAsync 方法后,值為 true。
  • WorkerSupportsCancellation:指示是否支持異步取消。要執(zhí)行 CancelAsync 方法,需要先設置該屬性為 true。
  • WorkerReportsProgress:指示是否能報告進度。要執(zhí)行 ReportProgress 方法,需要先設置該屬性為 true。

常用事件

  • DoWork: 調(diào)用 RunWorkerAsync 方法時發(fā)生。
  • ProgressChanged:可選,調(diào)用 ReportProgress 方法時發(fā)生。
  • RunWorkerCompleted:可選,后臺操作已完成、被取消或引發(fā)異常時發(fā)生。

注意:在 DoWork 事件處理程序中不操作任何用戶界面對象。而應該通過 ProgressChanged 和RunWorkerCompleted 事件與用戶界面進行通信。

如果想在 DoWork 事件處理程序中和用戶界面的控件通信,可在用 ReportProgress 方法。ReportProgress(int percentProgress, object userState),可以傳遞一個對象。ProgressChanged 事件可以從參數(shù)ProgressChangedEventArgs 類的UserState 屬性得到這個信息對象。這個事件也可以實現(xiàn)進度條功能,把任務的進度實時呈現(xiàn)給用戶。

簡單的程序用BackgroundWorker 比 Thread 方便,Thread中和用戶界面上的控件通信比較麻煩,需要用委托來調(diào)用控件的 Invoke 或BeginInvoke 方法,沒有 BackgroundWorker 方便。

使用backgroundWorker步驟

  • 新建BackgroundWorder對象;

  • 根據(jù)需求, 設置是否能取消(WorkerSupportsCancellation)、是否報告進度(WorkerReportsProgress);

  • 根據(jù)需求,設置好相關事件,DoWorker、ProgressChanged、ProgressChanged;

  • 調(diào)用RunWorkerAsyns()方法,啟動線程;

  • 在需要取消的位置,判斷CancellationPending的值,并做相關處理;//可選

  • 在適當?shù)奈恢谜{(diào)用ReportProgress(int percentProgress)方法,報告進度。

BackgroundWorker實例

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            backgroundWorker1.WorkerReportsProgress = true;//報告完成進度
            backgroundWorker1.WorkerSupportsCancellation = true;//允許用戶終止后臺線程
                                                                //綁定事件
            backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
            backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
            backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);

        }
        //開始按鈕
        private void button1_Click(object sender, EventArgs e)
        {
            if (!backgroundWorker1.IsBusy)//判斷backgroundWorker1是否正在運行異步操作
            {
                backgroundWorker1.RunWorkerAsync(1000);//開始執(zhí)行后臺異步操作,調(diào)用DoWork事件
            }
            while (backgroundWorker1.IsBusy)//等待后臺運行完畢
            {
                Application.DoEvents();
            }
            MessageBox.Show("操作完成");
        }

        //取消按鈕
        private void button2_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                backgroundWorker1.CancelAsync();//取消后臺操作
                backgroundWorker1.Dispose();//釋放資源
            }
        }

        //DoWork事件聲明要執(zhí)行的耗時操作
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker backgroundWorker = sender as BackgroundWorker;
            e.Result = ListNumber(backgroundWorker, e);//運算結(jié)果保存在e.Result中(在RunWorkerCompleted事件可能會使用到)
        }

        bool ListNumber(object sender, DoWorkEventArgs e)
        {
            int num = (int)e.Argument;//接收傳入的參數(shù),即RunWorkerAsync(object argument)傳入的值
            for (int i = 1; i <= num; i++)
            {
                if (backgroundWorker1.CancellationPending)//判斷是否請求了取消后臺操作,如果為false則退出
                {
                    e.Cancel = true;//e.Cancel 是否應該取消事件
                    return false;
                }
                Thread.Sleep(10);//執(zhí)行一個耗時操作
                backgroundWorker1.ReportProgress(i * 100 / num, i);//報告完成進度

            }
            return true;
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {

            progressBar1.Value = e.ProgressPercentage;//將完成進度數(shù)據(jù)傳給進度條
            label1.Text = e.ProgressPercentage + "%";
            //將中間計算結(jié)果在ListBox控件中顯示出來
            listBox1.Items.Add(e.UserState);//接收ReportProgress方法傳遞過來的userState
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true) //e.Cancelled指示異步操作是否已被取消
            {
                MessageBox.Show("Canceled!");
            }
            else if (e.Error != null) //e.Error 指示異步操作期間發(fā)生的錯誤
            {
                MessageBox.Show("Error: " + e.Error.Message);
            }
            else
            {
                MessageBox.Show(e.Result.ToString());  //e.Result 獲取異步操作結(jié)果的值,即DoWork事件中,Result設置的值。
            }

        }
    }

對Winform窗體控件進行安全調(diào)用

(WinForm中實現(xiàn)多線程的首選方法是backgroundWorker)

Thread thread = new Thread(SetLabel);//另開一個線程上設置Label的屬性
thread.Start();
 
delegate void Action(string args);//Net3.5自帶的Action無參數(shù)無返回值
private void SetLabel()
{
    Action action = delegate (string args)
    {
        this.label1.Text = args;
    };
    if (this.InvokeRequired)//判斷當前代碼是運行于創(chuàng)建該控件的線程之上,還是運行于另一個線程之上。
        this.Invoke(action, "XXX");//注意控件的Inovoke和BeginInvoke委托的方法都執(zhí)行在UI線程上。對Control的Invoke方法可以使用一個簡單的系統(tǒng)委托MethodInvoker無參數(shù)返回Void調(diào)用。
    else
        action("XXX");
}

到此這篇關于winform多線程組件BackgroundWorker的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C# 通過 inline-asm 解決嵌入x86匯編

    C# 通過 inline-asm 解決嵌入x86匯編

    此篇文章通過C#語言解決嵌入x86匯編,主要通過INline-asm方法來實現(xiàn),下面我通過圖片和代碼的形式給大家分享下,需要的朋友可以參考下
    2015-07-07
  • c#和javascript函數(shù)相互調(diào)用示例分享

    c#和javascript函數(shù)相互調(diào)用示例分享

    在webBrowser使用過程中為了C#和JS通訊,webBrowser必須設置ObjectForScripting的屬性,它是一個object,這個object可以提供給webBrowser控件載入的網(wǎng)頁上的script訪問
    2014-01-01
  • C# Oracle批量插入數(shù)據(jù)進度條的實現(xiàn)代碼

    C# Oracle批量插入數(shù)據(jù)進度條的實現(xiàn)代碼

    這篇文章主要介紹了C# Oracle批量插入數(shù)據(jù)進度條的實現(xiàn)代碼,需要的朋友可以參考下
    2018-04-04
  • C#中DataTable和List互轉(zhuǎn)的示例代碼

    C#中DataTable和List互轉(zhuǎn)的示例代碼

    很多場景下,我們需要將List轉(zhuǎn)換成為DataTable,本文主要介紹了C#中DataTable和List互轉(zhuǎn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • C#定時器和隨機數(shù)

    C#定時器和隨機數(shù)

    在前一篇中我們介紹了鍵盤和鼠標事件,其實還有一個非常常用的事件,就是定時器事件,如果要對程序?qū)崿F(xiàn)時間上的控制,那么就要使用到定時器。而隨機數(shù)也是很常用的一個功能,在我們要想產(chǎn)生一個隨機的結(jié)果時就要使用到隨機數(shù)。本文我們就來簡單介紹一下定時器和隨機數(shù)。
    2015-06-06
  • C# FileStream實現(xiàn)多線程斷點續(xù)傳

    C# FileStream實現(xiàn)多線程斷點續(xù)傳

    這篇文章主要為大家詳細介紹了C# FileStream實現(xiàn)多線程斷點續(xù)傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • c# 連接access數(shù)據(jù)庫config配置

    c# 連接access數(shù)據(jù)庫config配置

    c# 連接access數(shù)據(jù)庫config配置,需要的朋友可以參考一下
    2013-02-02
  • C#隊列Queue多線程用法實例

    C#隊列Queue多線程用法實例

    這篇文章主要介紹了C#隊列Queue多線程用法,實例分析了隊列的相關使用技巧,需要的朋友可以參考下
    2015-05-05
  • C#實現(xiàn)掃描局域網(wǎng)內(nèi)的所有IP和端口

    C#實現(xiàn)掃描局域網(wǎng)內(nèi)的所有IP和端口

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)掃描局域網(wǎng)內(nèi)的所有IP和端口的功能,文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • c#正反序列化XML文件示例(xml序列化)

    c#正反序列化XML文件示例(xml序列化)

    這篇文章主要介紹了c#正反序列化XML文件示例,可以將對象序列化為XML文本或者文件,或者將XML文件或文本反序列化為對象,要求進行序列化的對象不能出現(xiàn)序列化異常,支持類的嵌套,要求類的屬性為public
    2014-03-03

最新評論

中宁县| 翁源县| 涿鹿县| 盐源县| 大田县| 富平县| 长武县| 罗平县| 甘孜县| 永胜县| 广西| 清水河县| 延安市| 班戈县| 鲁甸县| 卫辉市| 北宁市| 迁西县| 日喀则市| 凌云县| 溧阳市| 阿荣旗| 巴马| 石棉县| 建平县| 札达县| 铜陵市| 宜兰市| 汝阳县| 晋州市| 昂仁县| 铁岭县| 洪湖市| 华阴市| 苏尼特左旗| 永福县| 察隅县| 博野县| 凤城市| 武平县| 潢川县|