程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#使用delegate異步執行方法

C#使用delegate異步執行方法

編輯:C#入門知識

在另外一個線程執行一個函數有很多種方法,這裡討論的是使用delegate的BeginInvoke方法,它的好處是在另一個線程中調用了函數,而且不用花費太多的開銷。

下面是使用delegate異步執行方法的示例:



class Program 

  static void Main(string[] args) 
  { 
    object syncObject = new object(); 
    Test test = new Test(); 
    int index = 0; 
    AutoResetEvent signal = new AutoResetEvent(false); 
    for (int i = 0; i < 10; i++) 
    { 
      test.BeginDoAction(delegate(object sender, EventArgs e) 
                         { 
                           lock (syncObject) 
                           { 
                             Interlocked.Increment(ref index); 
                             if (index == 10) 
                               signal.Set(); 
                             Console.WriteLine("Receive result."); 
                           } 
                         }); 
    } 
    Console.WriteLine("Waiting signal.");  
    signal.WaitOne(); 
    Console.WriteLine("Signaled."); 
 
    Console.ReadLine(); 
  } 

 
public delegate int GetDelegate(); 
 
class Test 

  private EventHandler<EventArgs> callbackCompleted; 
 
  public void BeginDoAction(EventHandler<EventArgs> pCallbackCompleted) 
  { 
    Console.WriteLine("Begin do action."); 
    callbackCompleted = pCallbackCompleted; 
    AsyncCallback callback = OnCompleted; 
    GetDelegate getDelegate = DoAction; 
    getDelegate.BeginInvoke(callback, null); 
  } 
 
  public int DoAction() 
  { 
    Console.WriteLine("Do action"); 
    Thread.Sleep(20000); 
    return 1; 
  } 
 
  private void OnCompleted(IAsyncResult result) 
  { 
    GetDelegate getDelegate = ((AsyncResult)result).AsyncDelegate as GetDelegate; 
    int print = getDelegate.EndInvoke(result); 
    if (callbackCompleted != null) 
      callbackCompleted(this, EventArgs.Empty); 
  } 
}   www.2cto.com


最終顯示結果如下,說明函數被異步調用。


 

\

delegate是在另一個線程上異步執行一個方法的一種方式,但是它的使用也有一定的局限,由於delegate實際上是使用thread pool進行異步執行的,因此thread pool本身就成了這種調用方式的制約,比方說thread pool的尺寸或者其所能執行的線程數等等。因此並不是所有的異步方法調用都適合用delegate方式調用


摘自 Enjoy .NET

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved