当前位置:编程学习 > C#/ASP.NET >>

C#使用delegate异步执行方法

在另外一个线程执行一个函数有很多种方法,这里讨论的是使用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.zzzyk.com


最终显示结果如下,说明函数被异步调用。


 

\

delegate是在另一个线程上异步执行一个方法的一种方式,但是它的使用也有一定的局限,由于delegate实际上是使用thread pool进行异步执行的,因此thread pool本身就成了这种调用方式的制约,比方说thread pool的尺寸或者其所能执行的线程数等等。因此并不是所有的异步方法调用都适合用delegate方式调用


摘自 Enjoy .NET

补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,