background (visual studio 2008)
程式功能:按下開始按鈕,label會從0開始增加,按下停止則會停在當前數值
step1.
開啟visual studio 2008建立一個window Form專案,在此以backgroundPro為方案名稱
(檔案 >> 新增 >> 專案 >>專案類型選擇 visual C# >>範本選擇 Window Form 應用程式)
step2.
利用工具箱建立兩個button一個label與一個background
(檢視 >>工具箱)
step3.
將button1屬性中的Name改為Start,Text改為開始,button2的Name改為Stop,Text改為停止。
(此步驟可不做)
step4.
在background的事件中,DoWork與RunWorkerCompleted點兩下增加程式碼,按鈕Click點兩下增加(亦可在按鈕上點兩下便會增加Click事件)
至此會自動產生四個事件程式碼
step5.
在background開始執行前,將 WorkerSupportsCancellation設定為true,才可呼叫CancelAsync。
在DoWork事件中跑回圈並顯示於label、RunWorkerCompleted事件中顯示結束訊息、Start_Click開始執行背景程式、Stop_Click停止背景程式
範例程式碼
namespace backgroundPro
{
public partial class Form1 : Form
{
int a;
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerSupportsCancellation = true;
//將WorkerSupportsCancellation才可呼叫CancelAsync,否則會發生例外錯誤
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 1000000; i++)
{
if (backgroundWorker1.CancellationPending) //若有選擇停止則會變為true
{
e.Cancel = true; //判斷是否該取消動作
break;
}
a = i;
Invoke(new Action(show)); //使用委派方式顯示當前的數值
}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//背景作業跳出時會執行此
MessageBox.Show("迴圈終止");
}
private void Start_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();//開始執行background
}
private void Stop_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
}
private void show()
{
this.label1.Text = Convert.ToString(a);
// 因為函式只能輸入方法名稱,故寫一方法為顯示數值。 (Invoke(new Action(方法名稱));)
}
}
}
step6.
顯示結果
其中e.cancel >> 如果RunWorkerCompletedEventArgs.Cancelled為True則結束 ,RunWorkerCompletedEventArgs.Cancelled為False則繼續 。
可能會有人有疑問為何在RunWorkerCompleted事件中不是直接檢查BackgroundWorker的CancellationPending屬性值,原因在於當DoWork事件執行完畢進入RunWorkerCompleted事件後,BackgroundWorker的CancellationPending屬性值將會恢復為False。
在DoWork區塊中 e,Cancel=True並不會讓BackgroundWorker停掉(因此我們必須自行撰寫跳離的程序),事實上這個動作是當離開DoWork到達RunWorkerCompleted的時候會將這個值傳遞過去,這樣就可以在RunWorkerCompleted以e.Cancelled的值來判斷我們是要再次呼叫與否.
這件事情很多書也沒說明清楚,很容易讓人誤以為只要e.Cancel=true就會自動停掉,實際上這只是傳遞一個值,它並不會自己停掉
此部分用的方法名、事件、屬性名稱與引發的功能
RunWorkerAsync() 啟動執行背景作業。
CancelAsync 要求取消暫止的背景作業。
RunWorkerAsync(Object) 啟動執行背景作業,並加入背景作業所要使用的參數。
CancellationPending 取得值,指出應用程式是否已經要求取消背景作業。
WorkerSupportsCancellation 取得或設定值,指出 BackgroundWorker 是否支援非同步取消。
DoWork 當呼叫 RunWorkerAsync 時發生。
RunWorkerCompleted 當背景作業已完成、取消或引發例外狀況時發生。
留言
張貼留言