轉載自:http://www.cnblogs.com/scottckt/archive/2008/05/08/1188974.html
在使用之前先了解一些知識。
1、BackgroundWorker作用:
主要用在單獨的線程上執行操作。BackgroundWorker類允許您在單獨的專用線程上運作操作。耗時的操作(如下載下傳和資料庫事務)在長時間運作時可能會導緻使用者界面 (UI) 似乎處于停止響應狀态。如果您需要能進行響應的使用者界面,而且面臨與這類操作相關的長時間延遲,則可以使用BackgroundWorker類友善地解決問題。
2、BackgroundWorker常用屬性:
名稱 | 說明 |
CancellationPending | 訓示應用程式是否已請求取消後台操作即(是否正在停止中)。 |
IsBusy | 獲取一個值,訓示 BackgroundWorker 是否正在運行非同步操作。 |
WorkerReportsProgress | 該值訓示 BackgroundWorker 能否報告進度更新。 |
WorkerSupportsCancellation | 該值訓示 BackgroundWorker 是否支援非同步取消。 |
3、BackgroundWorker常用事件:
控制項 | 名稱 | 說明 |
TextBox | txtSelect | 用於顯示被選擇檔案的路徑 |
Button | btnSelectFile | 用於選擇檔案 |
TextBox | txtResult | 用於顯示後台程式執行的結果 |
ProgressBar | pgbValue | 用於顯示背景程式執行的結果 |
Button | btnRun | 用於執行背景程式 |
Button | btnCancel | 用於取消正在執行的背景程式 |
BackgroundWorker | bgwWorker | 用於後台運行程式 |
4、注意:
運行RunWorkerAsync()方法會觸發DoWork事件
運行ReportProgress()方法會觸發ProgressChanged事件
5、使用過程:
5.1 在窗體中加入控件
5.2 加入BackgroundWorker的事件
5.3 在DoWork事件的方法中調用需要執行的方法
5.4 在ProgressChanged事件的方法中顯示進度
5.5 在RunWorkerCompleted事件的方法中顯示被執行方法的結果
6、代碼:
6.1 代碼中的控件說明:
控件 | 名稱 | 說明 |
TextBox | txtSelect | 用於顯示被選擇檔案的路徑 |
Button | btnSelectFile | 用於選擇檔案 |
TextBox | txtResult | 用於顯示後台程式執行的結果 |
ProgressBar | pgbValue | 用於顯示背景程式執行的結果 |
Button | btnRun | 用於執行背景程式 |
Button | btnCancel | 用於取消正在執行的背景程式 |
6.2代碼(下面代碼作用是將檔案轉成swf):
using System.ComponentModel;
using System.IO;
namespace BackgroundWorkerDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// “執行背景程式”按鈕事件
btnRun.Click += new EventHandler(btnRun_Click);
// “取消背景程式”按鈕事件
btnCancel.Click += new EventHandler(btnCancel_Click);
// 是否允許BackgroundWorker 能否報告進度
bgwWorker.WorkerReportsProgress = true ;
// 選擇檔案按鈕方法
btnSelectFile.Click += new EventHandler(btnSelectFile_Click);
//5.2
//開始執行背景操作時
// 當執行BackgroundWorker.RunWorkerAsync方法時會觸發該事件,并且傳遞DoWorkEventArgs參數;
bgwWorker.DoWork += new DoWorkEventHandler(bgwWorker_DoWork);
// 引發 ProgressChanged 事件。 ProgressChanged是負責報告目前程式進度
bgwWorker.ProgressChanged += new ProgressChangedEventHandler(bgwWorker_ProgressChanged);
// 當背景操作已完成、被取消或引發異常時發生。
bgwWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgwWorker_RunWorkerCompleted);
}
/// <summary>
/// 被選擇的檔案
/// </summary>
string sFile = "" ;
/// <summary>
/// ProgressBar的值
/// </summary>
int iProgressValue = 1 ;
String fs_filename = "" ;
/// <summary>
/// 得到轉換後檔案在服務器的絕對路徑
/// </summary>
String fs_convertedfilename = "" ;
/// <summary>
/// 得到選項選擇的結果(0為瀏覽)
/// </summary>
int interfaceOptions = 0 ;
/// <summary>
/// 選擇檔案
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void btnSelectFile_Click( object sender, EventArgs e)
{
// 選擇檔案
OpenFileDialog ofdDialog = new OpenFileDialog();
if (ofdDialog.ShowDialog() == DialogResult.OK)
{
sFile = ofdDialog.FileName;
string sFilePathName = Path.GetDirectoryName(sFile) + " \\ " + Path.GetFileNameWithoutExtension(sFile);
txtSelect.Text = sFile;
fs_filename = sFile;
// 得到轉換後的檔案名
fs_convertedfilename = sFilePathName + " .swf " ;
}
}
/// <summary>
/// “執行背景程式”按鈕事件的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void btnRun_Click( object sender, EventArgs e)
{
string sFile = "" ;
// 開始執行任務,會觸發DoWork事件
bgwWorker.RunWorkerAsync(sFile);
}
/// <summary>
/// “取消背景程式”按鈕事件的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void btnCancel_Click( object sender, EventArgs e)
{
if (bgwWorker.IsBusy)
{
// 取消操作
bgwWorker.CancelAsync();
txtResult.Text += " 已取消 " ;
}
}
/// <summary>
/// 開始執行背景操作時
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void bgwWorker_DoWork( object sender, DoWorkEventArgs e)
{
BackgroundWorker bgwValue = (BackgroundWorker)sender;
// 報告進度(進度值需自己傳入)
bgwWorker.ReportProgress(iProgressValue);
//5.3
//運行需要運行的方法。
RunPrint2Falsh();
if ( RunPrint2Falsh() == true )
{
bgwWorker.ReportProgress( 100 );
}
}
/// <summary>
/// 背景程式進度方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void bgwWorker_ProgressChanged( object sender, ProgressChangedEventArgs e)
{
//5.4
// 設置ProgressBar設
pgbValue.Value = e.ProgressPercentage;
}
/// <summary>
/// 背景程式運行完成事件方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void bgwWorker_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e)
{
//5.5
txtResult.Text += " 完成! " ;
}
/// <summary>
/// 運行將檔案轉換成Flash程式(此處引用了Print2Flash控件)
/// </summary>
/// <returns></returns>
private bool RunPrint2Falsh()
{
bool sRetrun = false ;
try
{
P2F.Server2 p2fServer = new P2F.Server2();
p2fServer.DefaultProfile.InterfaceOptions = interfaceOptions;
p2fServer.ConvertFile(fs_filename, fs_convertedfilename, null , null , null );
sRetrun = true ;
}
catch (Exception ex)
{
throw ex;
}
return sRetrun;
}
}
}