HOW TO:使用支援事件架構非同步模式的元件
更新:2007 年 11 月
許多元件都會提供您以非同步的方式執行工作。例如,SoundPlayer 和 PictureBox 元件,就能讓您「從幕後」載入音效和影像,而不會中斷主執行緒同時繼續執行。
要對支援事件架構非同步模式概觀的類別使用非同步方法,就像處理其他任何事件一樣簡單,只要將事件處理常式附加到元件的 MethodNameCompleted 事件即可。當您呼叫 MethodNameAsync 方法時,直到引發 MethodNameCompleted 事件為止,應用程式都會繼續執行而不中斷。在事件處理常式中,您可以檢查 AsyncCompletedEventArgs 參數以判斷非同步作業 (Asynchronous Operation) 是否成功完成,或是已經取消。
如需使用事件處理常式的詳細資訊,請參閱事件處理常式概觀 (Windows Form)。
下列程序會示範如何使用 PictureBox 控制項的非同步影像載入功能。
若要啟用 PictureBox 控制項以非同步方式載入影像
在您的表單中建立 PictureBox 元件的執行個體。
將事件處理常式指派給 LoadCompleted 事件。
請在此檢查進行非同步下載時可能發生的任何錯誤。這也是您檢查取消的地方。
Friend WithEvents PictureBox1 As System.Windows.Forms.PictureBox
public Form1() { InitializeComponent(); this.pictureBox1.LoadCompleted += new System.ComponentModel.AsyncCompletedEventHandler(this.pictureBox1_LoadCompleted); }
Private Sub PictureBox1_LoadCompleted( _ ByVal sender As System.Object, _ ByVal e As System.ComponentModel.AsyncCompletedEventArgs) _ Handles PictureBox1.LoadCompleted If (e.Error IsNot Nothing) Then MessageBox.Show(e.Error.Message, "Load Error") ElseIf e.Cancelled Then MessageBox.Show("Load cancelled", "Canceled") Else MessageBox.Show("Load completed", "Completed") End If End Sub
private void pictureBox1_LoadCompleted(object sender, AsyncCompletedEventArgs e) { if (e.Error != null) { MessageBox.Show(e.Error.Message, "Load Error"); } else if (e.Cancelled) { MessageBox.Show("Load canceled", "Canceled"); } else { MessageBox.Show("Load completed", "Completed"); } }
將稱為 loadButton 和 cancelLoadButton 的兩個按鈕加入表單中。加入 Click 事件處理常式以啟動和取消下載。
Private Sub loadButton_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles loadButton.Click ' Replace with a real url. PictureBox1.LoadAsync("http://www.tailspintoys.com/image.jpg") End Sub
private void loadButton_Click(object sender, EventArgs e) { // Replace with a real url. pictureBox1.LoadAsync("http://www.tailspintoys.com/image.jpg"); }
Private Sub cancelLoadButton_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles cancelLoadButton.Click PictureBox1.CancelAsync() End Sub
private void cancelLoadButton_Click(object sender, EventArgs e) { pictureBox1.CancelAsync(); }
執行您的應用程式。
在進行影像下載時,您可以隨意移動表單、最小化表單,以及最大化表單。