C# BackgroundWorker組件學(xué)習(xí)入門介紹
一個(gè)程序中需要進(jìn)行大量的運(yùn)算,并且需要在運(yùn)算過程中支持用戶一定的交互,為了獲得更好的用戶體驗(yàn),使用BackgroundWorker來完成這一功能.
BackgroundWorker類允許您在單獨(dú)的專用線程上運(yùn)行操作。 耗時(shí)的操作(如下載和數(shù)據(jù)庫(kù)事務(wù))在長(zhǎng)時(shí)間運(yùn)行時(shí)可能會(huì)導(dǎo)致用戶界面 (UI) 似乎處于停止響應(yīng)狀態(tài)。
如果您需要能進(jìn)行響應(yīng)的用戶界面,而且面臨與這類操作相關(guān)的長(zhǎng)時(shí)間延遲,則可以使用 BackgroundWorker類方便地解決問題(MSDN)。
若要在后臺(tái)執(zhí)行耗時(shí)的操作,請(qǐng)創(chuàng)建一個(gè) BackgroundWorker,偵聽那些報(bào)告操作進(jìn)度并在操作完成時(shí)發(fā)出信號(hào)的事件。 可以通過編程方式創(chuàng)建 BackgroundWorker,
也可以將它從“工具箱”的“組件”選項(xiàng)卡中拖到窗體上。 如果在 Windows 窗體設(shè)計(jì)器中創(chuàng)建 BackgroundWorker,則它會(huì)出現(xiàn)在組件欄中,而且它的屬性會(huì)顯示在“屬性”窗口中(MSDN)。
屬性:
IsBusy:獲取一個(gè)值,指示 BackgroundWorker 是否正在運(yùn)行異步操作。
WorkerReportsProgress:獲取或設(shè)置一個(gè)值,該值指示 BackgroundWorker 能否報(bào)告進(jìn)度更新。
WorkerSupportsCancellation:獲取或設(shè)置一個(gè)值,該值指示 BackgroundWorker 是否支持異步取消。
事件:
DoWork:調(diào)用 RunWorkerAsync 時(shí)發(fā)生。
ProgressChanged:調(diào)用 ReportProgress 時(shí)發(fā)生。
RunWorkerCompleted:當(dāng)后臺(tái)操作已完成、被取消或引發(fā)異常時(shí)發(fā)生。
實(shí)例:
窗體設(shè)計(jì)如下圖:
代碼實(shí)現(xiàn):
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 WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 1; i <= 12; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
System.Threading.Thread.Sleep(500);
worker.ReportProgress(i * 10);
}
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
lbResult.Text = (e.ProgressPercentage.ToString() + "%"+e.UserState);
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
lbResult.Text = "Canceled!";
}
else if (e.Error != null)
{
lbResult.Text = "Error: " + e.Error.Message;
}
else
{
lbResult.Text = "Done!";
}
}
private void btnStartAsync_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy != true)
{
backgroundWorker1.RunWorkerAsync();
}
}
private void btnCancelAsync_Click(object sender, EventArgs e)
{
if (backgroundWorker1.WorkerSupportsCancellation == true)
{
backgroundWorker1.CancelAsync();
}
}
}
}
運(yùn)行結(jié)果:



相關(guān)文章
C#實(shí)現(xiàn)定義一套中間SQL可以跨庫(kù)執(zhí)行的SQL語句(案例詳解)
這篇文章主要介紹了C#實(shí)現(xiàn)定義一套中間SQL可以跨庫(kù)執(zhí)行的SQL語句,主要包括hisql查詢樣例、group by查詢、鏈?zhǔn)讲樵兗癶isql語句和鏈?zhǔn)讲樵兓煊玫膕ql語句,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
WPF實(shí)現(xiàn)監(jiān)聽快捷鍵的方式分享
這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)監(jiān)聽快捷鍵的幾種方式,文中的示例代碼講解詳細(xì),具有一定的借鑒與學(xué)習(xí)價(jià)值,需要的可以了解一下2023-03-03
C# web.config之<customErrors>節(jié)點(diǎn)說明案例詳解
這篇文章主要介紹了C# web.config之<customErrors>節(jié)點(diǎn)說明案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C#使用Winform編寫一個(gè)圖片預(yù)覽器管理
這篇文章主要為大家詳細(xì)介紹了C#如何使用Winform編寫一個(gè)通用圖片預(yù)覽器管理,包含滾輪放大縮小,剪切,下一頁(yè),方向變化等,需要的可以參考下2024-02-02
C#具名參數(shù)(Named Parameters)的使用
在C#中,具名參數(shù)是一種在方法調(diào)用中使用參數(shù)名稱來指定參數(shù)值的技術(shù),本文主要介紹了C#具名參數(shù)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01

