使用.NET异步委托

原创 2006年06月04日 11:51:00

异步委托通过编译器提供的BeginInvoke方法与EndInvoke方法对delegate进行异步的调用.
被调用方法将在系统线程池中运行,并且被调用方没有必要为异步执行行为提供附加的代码支持.
当异步执行结束时,通过调用回调函数发出通知.

如果委托在异步执行中抛出了异常,那么在调用EndInvoke时才会被捕获到

MSDN页面:
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpovrasynchronousprogrammingoverview.htm
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconasynchronousdesignpatternoverview.htm


以下为示例:

using System;
using System.Threading;
using System.Runtime.Remoting.Messaging;

namespace AsyncDele
{
 // 定义被调用方法的delegate
 public delegate bool Workdele( int source, out int ithreadid );

 // 被调用方,封装被调用方法
 class Worker
 {
  public bool Dowork( int source, out int ithreadid )
  {
   ithreadid = AppDomain.GetCurrentThreadId();
   Console.WriteLine( "my work starting in thread:{0}...", ithreadid );

   Thread.Sleep( 5000 );

   Console.WriteLine( "my work ended in thread:{0}", ithreadid );
   return (source % 2) == 0;
  }
 }

 // 封装完成回调方法
 class ProcessWorkResult
 {
  public void CallbackMethod( IAsyncResult ar )
  {
   Console.WriteLine( "callback int thread:{0}", AppDomain.GetCurrentThreadId() );
   Workdele wd = (Workdele)((AsyncResult)ar).AsyncDelegate;
   int ithreadid;
   bool bret = wd.EndInvoke( out ithreadid, ar );
   Console.WriteLine( "callback end: ithreadid={0} bret={1}", ithreadid, bret );
  }
 }

 // 调用方
 class AsyncWorker
 {
  public void Dowork( int source )
  {
   Worker worker = new Worker();
   Workdele wd = new Workdele( worker.Dowork );

   ProcessWorkResult wr = new ProcessWorkResult();
   AsyncCallback cb = new AsyncCallback( wr.CallbackMethod );

   Console.WriteLine( "begin aync invoke..." );
   int ithreadid;
   IAsyncResult ar = wd.BeginInvoke( source, out ithreadid, cb, (object)source );
   Thread.Sleep( 0 );
   Console.WriteLine( "async invoke return." );
  }
 }

 class Class1
 {
  static void Main(string[] args)
  {
   Console.WriteLine( "start" );

   AsyncWorker worker = new AsyncWorker();
   worker.Dowork( 13 );
   
   Console.WriteLine( "press enter to exit." );
   Console.ReadLine();
  }
 }
}

执行结果如下:
start
begin aync invoke...
my work starting in thread:2760...
async invoke return.
press enter to exit.
my work ended in thread:2760
callback int thread:2760
callback end: ithreadid=2760 bret=False

相关文章推荐

黑马程序员_学习日记66_716ASP.NET(使用回调函数的异步委托、生产者消费者)

一、使用回调函数的异步委托 namespace 使用回调函数的异步委托 { delegate int AddDel(int a,int b); class Program ...

vb.net的异步读写数据流(使用线程、委托)

    在理解异步读写前,了解一下线程和委托是必要的。 一、线程与委托         1、为什么要用异步?               无论是MemoryStream,B...

笔记7:vb.net的异步读写数据流(使用线程、委托)

一、线程与委托        Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventAr...

[zz]谈.Net委托与线程——创建无阻塞的异步调用(二)

了解IAsyncResult          现在我们已经了解,EndInvoke可以给我们提供传出参数与更新后的ref参数;也可以向我们导出异步函数中的异常信息。例如,我们使用BeginInvok...

VB.NET异步委托调用实现串口的自收自发

原贴地址:http://blog.sina.com.cn/s/blog_7223c1af0100nryn.html PS:不用异步,有时问题很是莫名其妙,郁闷了很久才想到是这个的原因 本文在VB....
  • rztyfx
  • rztyfx
  • 2013年02月19日 18:00
  • 2596

谈.Net委托与线程——创建无阻塞的异步调用(二)

了解IAsyncResult          现在我们已经了解,EndInvoke可以给我们提供传出参数与更新后的ref参数;也可以向我们导出异步函数中的异常信息。例如,我们使用Begin...

.NET简谈组件程序设计之(异步委托)

说到委托我想大家基本上都用过的,今天这篇文章就来讲解关于委托的异步奥秘。 在我们正常使用的时候很少会去用异步委托技术来提高代码效率。委托的好处就是能对方法进行面向对象的封装,随意传递。在任何组件...

.Net的异步机制(委托Delegate) - step 1

在阅读下面知识前,我已经认为你已经具有c#的基础,包括简单的委托知识; 代码使用VS2008开发,但是会在.Net Framework 2.0(C Sharp)编写   什么是.Net...
  • Ts_Coo
  • Ts_Coo
  • 2012年08月11日 21:11
  • 726

谈.Net委托与线程——创建无阻塞的异步调用

前言本文大部分内容来自于mikeperetz的Asynchronous Method Invocation及本人的一些个人体会所得,希望对你有所帮助。原英文文献可以在codeproject中搜索到。介...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用.NET异步委托
举报原因:
原因补充:

(最多只允许输入30个字)