最稳的pk10计划iphone 北京pk10计划手机软件 北京pk10数字的规律 超神手机版pk10软件 pk10北京赛车9码技巧 pk10四期倍投计划表 pk10极速赛车论坛 北京赛车冠军怎样选5码 北京赛车系统下载安装 pk10教程视频 北京pk10选号公式 北京赛车pk10赚钱技巧 北京赛车怎么提升概率 pk10技巧北京快三 北京pk10大小计划
VB.net 2010 視頻教程 VB.net 2010 視頻教程 VB.net 2010 視頻教程
SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
當前位置:
首頁 > 編程開發 > C#編程 >
  • C#教程之C#之BackgroundWorker從簡單入門到深入精通的

  • 2019-08-16 20:29 來源:未知

需求分析

經常用到的耗時操作,例如:

1、文件下載和上載(包括點對點應用程序傳輸文件,從網絡下載文件、圖像等)
2、數據庫事務(從數據庫讀到大量的數據到WinForm界面中的DataGridview里呈現)
3、復雜的本地計算
4、本地磁盤文件訪問(讀寫文件,磁盤文件列表)
……

這些操作在長時間運行時會導致用戶界面 (UI) 處于停止響應狀態,用戶在這操作期間無法進行其他的操作,造成非常差的用戶體驗,為了不使UI層處于停止響應狀態,則可以使用 BackgroundWorker 類方便地解決這類問題。這個后臺的線程處理,可以很好的實現常規操作的同時,還可以及時通知UI當前處理信息的進度等。


MSDN的介紹

BackgroundWorker是.NET Framework 里用來執行多線程任務的控件,它允許開發人員在一個單獨的線程上執行一些操作。耗時的操作(如下載和數據庫事務)在長時間運行時可能會導致用戶界面 (UI) 似乎處于停止響應狀態。 如果您需要能進行響應的用戶界面,而且面臨與這類操作相關的長時間延遲,則可以使用 BackgroundWorker 類方便地解決問題。

若要在后臺執行耗時的操作,請創建一個 BackgroundWorker,偵聽那些報告操作進度并在操作完成時發出信號的事件。 可以通過編程方式創建 BackgroundWorker,也可以將它從“工具箱”的“組件”選項卡中拖到窗體上。 如果在 Windows 窗體設計器中創建 BackgroundWorker,則它會出現在組件欄中,而且它的屬性會顯示在“屬性”窗口中。

若要為后臺操作做好準備,請添加 DoWork 事件的事件處理程序。 在此事件處理程序中調用耗時的操作。 若要開始此操作,請調用 RunWorkerAsync。 若要收到進度更新的通知,請處理 ProgressChanged 事件。 若要在操作完成時收到通知,請處理 RunWorkerCompleted 事件。

有2點需要注意的:

1、由于DoWork事件內部的代碼運行在非UI線程之上,確保在 DoWork 事件處理程序中不操作任何用戶界面對象。 而應該通過 ProgressChanged 和 RunWorkerCompleted 事件與用戶界面進行通信。
2、BackgroundWorker 事件不跨 AppDomain 邊界進行封送處理。 請不要使用 BackgroundWorker 組件在多個 AppDomain 中執行多線程操作。

 

最簡單示例

準備材料:一個耗時的操作

 代碼如下,這個就不多解釋了:

復制代碼

int iSum = 0;
private void button1_Click(object sender, EventArgs e)
{
  for (int i = 0; i <= 100; i++)
  {
    iSum+=i;
    System.Threading.Thread.Sleep(300);
  }
}

復制代碼

 運行一下,拖動程序界面看看,直接卡死了,假死,一會兒,運算完了,就又可以拖動了。現在用BackgroundWorker來解決這個問題。

 為此,我們新建一個WindowsForm命名為bgwA,拖入一個Label命名為lblPercent,一個ProgressBar命名為pgbPercent,一個Button命名為btnStart。

 

然后,代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace bgwA
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void BtnStart_Click(object sender, EventArgs e)
        {
            BackgroundWorker bgwA = new BackgroundWorker();
            bgwA.WorkerReportsProgress = true;
            bgwA.DoWork += bgwA_DoWork;
            bgwA.ProgressChanged += bgwA_ProgressChanged;
            bgwA.RunWorkerCompleted += bgwA_Completed;
            bgwA.RunWorkerAsync();
        }
 
        private void bgwA_DoWork(object sender, DoWorkEventArgs e)
        {
            var bgworker = sender as BackgroundWorker;
            for (int i = 0; i <= 100; i++)
            {
                bgworker.ReportProgress(i);
                System.Threading.Thread.Sleep(200);
            }
        }
 
        private void bgwA_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.pgbPercent.Value = e.ProgressPercentage;
            this.lblPercent.Text = @"已完成:" + e.ProgressPercentage.ToString() + @"%";
        }
        private void bgwA_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            this.lblPercent.Text = "后臺操作結束(可能是程序100%完成,也可能是用戶取消或程序異常導致結束)。";
        }
    }
}
pk10赛车冠军技巧
最稳的pk10计划iphone 北京pk10计划手机软件 北京pk10数字的规律 超神手机版pk10软件 pk10北京赛车9码技巧 pk10四期倍投计划表 pk10极速赛车论坛 北京赛车冠军怎样选5码 北京赛车系统下载安装 pk10教程视频 北京pk10选号公式 北京赛车pk10赚钱技巧 北京赛车怎么提升概率 pk10技巧北京快三 北京pk10大小计划
短线股票推荐网 捕鱼达人1 2018宁波开出租车赚钱吗 汽车修理厂怎么靠保险赚钱 怎么玩快三赚钱 腾讯分分彩2018计划软件 2017年赚钱攻略首先找人借20万 倩女幽魂放生灵兽赚钱 彩名堂app怎么下载