在使用之前先了解一些知識。
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.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;
}
}
}