達步社群專業網站 達步社群 (Dabutek Community)

RSS

社區設施





快速搜尋
»
進階搜尋» 技術支援官網
   
 

Table of Contents [Hide/Show]


      基本概念
      設計模型

作者: 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);
} 



ScrewTurn Wiki version 3.0.5.600. Some of the icons created by FamFamFam.