加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

C#使用delegate异步执行技巧

发布时间:2021-11-24 15:34:32 所属栏目:PHP教程 来源:互联网
导读:在另外一个线程执行一个函数有很多种方法,这里讨论的是使用delegate的BeginInvoke方法,它的好处是在另一个线程中调用了函数,而且不用花费太多的开销。 下面是使用delegate异步执行方法的示例: [csharp] class Program { static void Main(string[] args)

在另外一个线程执行一个函数有很多种方法,这里讨论的是使用delegate的BeginInvoke方法,它的好处是在另一个线程中调用了函数,而且不用花费太多的开销。
 
下面是使用delegate异步执行方法的示例:
 
[csharp]
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);  
  }  
}  
最终显示结果如下,说明函数被异步调用。
 
 
delegate是在另一个线程上异步执行一个方法的一种方式,但是它的使用也有一定的局限,由于delegate实际上是使用thread pool进行异步执行的,因此thread pool本身就成了这种调用方式的制约,比方说thread pool的尺寸或者其所能执行的线程数等等。因此并不是所有的异步方法调用都适合用delegate方式调用。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读