作者: Tomex Ou
版本歷史:
2008/06/05 PM 03:50:49 實作自訂FtpClient類別之非同步取得檔案清單函式設計,符合.NET Asynchronous規格。
基本概念
1. BeginXXX()是利用ThreadPool另增一個Background Thread來執行工作(要自行控制Shared Data的同步工作),因為這個背景特性,當主Thread結束(Foreground)時,這些仍在執行的背景工作會全部中斷結束。
ThreadPool.QueueUserWorkItem(new WaitCallback(this.Run), asyncResult);
2. 使用BeginXXX()時,應該也要呼叫EndXXX()來回收相關資源。
設計模型
以一個GetFileList()函式為例,它傳回string[]陣列,示範如何設計一個支援非同步的BeginXXX()/EndXXX():
static void Main(string[] args)
{
Program p = new Program();
// 同步方式
string[] syncList = pp.GetFileList();
// 非同步方式
p.BeginGetFileList(new AsyncCallback(GetFileListMethod));
// 主UI執行緒等待
Console.ReadKey();
}
public void GetFileListMethod(IAsyncResult ar)
{
Program p = ar.AsyncState as Program ;
// 取得檔案清單
string[] asyncList = p.EndGetFileList(ar);
}
Design Pattern如下:
1.先宣告函式的delegate
private delegate string[] GetFileListCallback();
2. 建立BeginXXX()函式:
public System.IAsyncResult BeginGetFileList(System.AsyncCallback callback)
{
GetFileListCallback ftpCallback = new GetFileListCallback(this.GetFileList);
return ftpCallback.BeginInvoke(callback, this);
}
2. 建立EndXXX()函式:
public string[] EndGetFileList(IAsyncResult ar)
{
AsyncResult asyncResult = ar as AsyncResult;
GetFileListCallback asyncDelegate = (GetFileListCallback)asyncResult.AsyncDelegate;
return asyncDelegate.EndInvoke(ar);
}