使用.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

[深入学习C#]完成异步委托的三种方式

简介  创建线程的一个简单方式是定义一个委托,并且异步调用它。委托是方法的类型安全的引用。Delegate类还支持异步地调用方法。在后台,Delegate类会创建一个执行任务的线程。线程  线程是程序...
  • honantic
  • honantic
  • 2015年07月07日 10:22
  • 24192

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

    在理解异步读写前,了解一下线程和委托是必要的。 一、线程与委托         1、为什么要用异步?               无论是MemoryStream,B...
  • action20
  • action20
  • 2014年04月21日 08:41
  • 1827

C# 用委托BeginInvoke做异步线程

一个应用场景,浏览器上传一个文件,此文件后台调用文件转换,需要耗费相当长的时间,这样,如果是一个线程同步式的做下去,那么用户在浏览器上感觉就是卡住了,卡卡卡卡,这里我们利用委托的BeginInvoke...
  • chenqiangdage
  • chenqiangdage
  • 2015年11月18日 17:48
  • 2190

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

一、使用回调函数的异步委托 namespace 使用回调函数的异步委托 { delegate int AddDel(int a,int b); class Program ...
  • kuangjian007
  • kuangjian007
  • 2012年07月22日 22:08
  • 440

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

一、线程与委托        Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventAr...
  • dzweather
  • dzweather
  • 2013年10月19日 14:20
  • 6663

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

    在理解异步读写前,了解一下线程和委托是必要的。 一、线程与委托         1、为什么要用异步?               无论是MemoryStream,B...
  • action20
  • action20
  • 2014年04月21日 08:41
  • 1827

VS2010轻松学习C#-从零到深入-天轰穿.NET4趣味编程视频教程_第43讲:线程通信与异步委托

  • 2017年07月26日 03:04
  • 52.63MB
  • 下载

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

前言 本文大部分内容来自于mikeperetz的Asynchronous Method Invocation及本人的一些个人体会所得,希望对你有所帮助。原英文文献可以在codeproject...
  • farmwang
  • farmwang
  • 2017年01月18日 21:03
  • 150

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

前言 本文大部分内容来自于mikeperetz的Asynchronous Method Invocation及本人的一些个人体会所得,希望对你有所帮助。原英文文献可以在codeproject...
  • cqkxzyi
  • cqkxzyi
  • 2014年11月14日 23:34
  • 571

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

原贴地址:http://blog.sina.com.cn/s/blog_7223c1af0100nryn.html PS:不用异步,有时问题很是莫名其妙,郁闷了很久才想到是这个的原因 本文在VB....
  • rztyfx
  • rztyfx
  • 2013年02月19日 18:00
  • 2659
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用.NET异步委托
举报原因:
原因补充:

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