`
lovnet
  • 浏览: 6713919 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

异步编程模型--使用 IAsyncResult 对象

阅读更多

先推荐阅读下面的资料:

MSDN:异步编程设计模式

IBM developerworks: 使用异步 I/O 大大提高应用程序的性能

参考博文:

1、正确使用异步操作

2、Lab:体会ASP.NET异步处理请求的效果

3、WCF中的异步调用

4、WCF从理论到实践(11)-异步

5、异步编程

.NET Framework 为异步操作提供两种设计模式:
1、使用 IAsyncResult 对象的异步操作。
2、使用事件的异步操作。

IAsyncResult接口类型

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->[ComVisible(true)]
publicinterfaceIAsyncResult
{
//摘要:
//获取用户定义的对象,它限定或包含关于异步操作的信息。
//
//返回结果:
//用户定义的对象,它限定或包含关于异步操作的信息。
objectAsyncState{get;}
//
//摘要:
//获取用于等待异步操作完成的System.Threading.WaitHandle。
//
//返回结果:
//用于等待异步操作完成的System.Threading.WaitHandle。
WaitHandleAsyncWaitHandle{get;}
//
//摘要:
//获取异步操作是否同步完成的指示。
//
//返回结果:
//如果异步操作同步完成,则为true;否则为false。
boolCompletedSynchronously{get;}
//
//摘要:
//获取异步操作是否已完成的指示。
//
//返回结果:
//如果操作完成则为true,否则为false。
boolIsCompleted{get;}
}


下面是使用 IAsyncResult 对象的测试代码。

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->publicdelegatestringAsyncDelegate(intcallDuration,outintthreadId);
classProgram
{
staticvoidMain(string[]args)
{
Fun1();
Console.ReadLine();
}

privatestaticintthreadId;

//阻塞等待使用EndInvoke等待异步调用
staticvoidFun1()
{
//创建示例类的实例。
AsyncDemoad=newAsyncDemo();
//创建委托
AsyncDelegatedlgt=newAsyncDelegate(ad.TestMethod);
//委托在这里开始异步调用。
IAsyncResultar=dlgt.BeginInvoke(5000,outthreadId,null,null);
//人为的线程阻塞。
Thread.Sleep(0);
Console.WriteLine(
"主线程{0}开始工作",Thread.CurrentThread.ManagedThreadId);
//委托开始EndInvoke调用,这个过程会使主线程等待异步调用完成并返回结果。
stringret=dlgt.EndInvoke(outthreadId,ar);
Console.WriteLine(
"异步线程{0},返回值\"{1}\".",threadId,ret);
Console.WriteLine(
"主线程{0}结束工作",Thread.CurrentThread.ManagedThreadId);
}

//阻塞等待使用WaitHandle等待异步调用
staticvoidFun2()
{
AsyncDemoad
=newAsyncDemo();
AsyncDelegatedlgt
=newAsyncDelegate(ad.TestMethod);
IAsyncResultar
=dlgt.BeginInvoke(5000,outthreadId,null,null);
Thread.Sleep(
0);
Console.WriteLine(
"主线程{0}开始工作",Thread.CurrentThread.ManagedThreadId);
//主线程在这里等待,直到异步线程执行完。
ar.AsyncWaitHandle.WaitOne();
//和前一方案的区别在于,你可以在异步调用完成后,获取异步调用返回值之前
//在这里做点任何你想作的事。
//调用EndInvoke获取异步调用的返回结果.
stringret=dlgt.EndInvoke(outthreadId,ar);
Console.WriteLine(
"异步线程{0},返回值\"{1}\".",threadId,ret);
Console.WriteLine(
"主线程{0}结束工作",Thread.CurrentThread.ManagedThreadId);
}

//轮询状态轮询异步调用完成
staticvoidFun3()
{
AsyncDemoad
=newAsyncDemo();
AsyncDelegatedlgt
=newAsyncDelegate(ad.TestMethod);
IAsyncResultar
=dlgt.BeginInvoke(5000,outthreadId,null,null);
Console.WriteLine(
"主线程{0}开始工作",Thread.CurrentThread.ManagedThreadId);
//这里每隔10毫秒就检测(轮询)一下异步执行的状态,
//直到异步调用完成,IsCompleted的值变为ture为止。
while(ar.IsCompleted==false)
{
Thread.Sleep(
10);
}

//还记得微软的那个善意的提醒吗?虽然IsCompleted为true了,
//我们还是调用一下EndInvoke,来获取返回值。
stringret=dlgt.EndInvoke(outthreadId,ar);
Console.WriteLine(
"异步线程{0},返回值\"{1}\".",threadId,ret);
Console.WriteLine(
"主线程{0}结束工作",Thread.CurrentThread.ManagedThreadId);
}

//通知机制异步调用完成时执行回调方法
staticvoidFun4()
{
AsyncDemoad
=newAsyncDemo();
AsyncDelegatedlgt
=newAsyncDelegate(ad.TestMethod);
//注意第三个参数,这就是我们要用到的回调方法。
//第四个参数更为有趣,它可以是任何Object对象,这里它就是
//执行异步调用的委托本身,把委托本身传递进去的原因在下面可以看到。
Console.WriteLine("主线程{0}开始工作",Thread.CurrentThread.ManagedThreadId);
IAsyncResultar
=dlgt.BeginInvoke(5000,outthreadId,newAsyncCallback(CallbackMethod),dlgt);
Console.WriteLine(
"主线程{0}结束工作",Thread.CurrentThread.ManagedThreadId);
Console.ReadLine();
}
//回调函数必须严格的遵照AsyncCallback委托的签名。
staticvoidCallbackMethod(IAsyncResultar)
{
//在这里,上面那个dlgt作为参数的作用得到了体现,原来它就是为了完成对EndInvoke的调用啊。
AsyncDelegatedlgt=(AsyncDelegate)ar.AsyncState;
//通过对EndInvoke的调用获取返回值。
stringret=dlgt.EndInvoke(outthreadId,ar);
Console.WriteLine(
"异步线程{0},返回值\"{1}\".",threadId,ret);
}
}
//使用异步编程模型
publicclassAsyncDemo
{
publicstringTestMethod(intcallDuration,outintthreadId)
{
Console.WriteLine(
"异步方法开始工作");
Thread.Sleep(callDuration);
threadId
=Thread.CurrentThread.ManagedThreadId;
return"异步方法执行时间"+callDuration.ToString();
}
}

执行结果:

Fun1--------------------

异步方法开始工作
主线程 10开始工作
异步线程 7,返回值 "异步方法执行时间 5000".
主线程10结束工作
Fun2---------------------
异步方法开始工作
主线程 10开始工作
异步线程 7,返回值 "异步方法执行时间 5000".
主线程10结束工作
Fun3---------------------

主线程 10开始工作
异步方法开始工作
异步线程 7,返回值 "异步方法执行时间 5000".
主线程10结束工作
Fun4---------------------
主线程 10开始工作
主线程 10结束工作
异步方法开始工作
异步线程 7,返回值 "异步方法执行时间 5000".
--------------------------

工作当中有一个调用ActiveMQ的产品,每天大概是上万的消息。压力也不是很大。最近总是出现调用MQ阻塞的情况。负责MQ的同事也没有找到原因。

我是想寻找一个消息队列的代替品。 上面的第四个方法,异步线程不阻塞调用线程,当然调用线程也无需处理调用结果,貌似可以作为一个代替方案。


分享到:
评论

相关推荐

    使用IAsyncResult 对象的异步操作与使用事件的异步操作

    使用IAsyncResult 对象的异步操作与使用事件的异步操作

    异步编程:异步编程模型(APM)

    异步编程模型(APM)是.NET1.0的时候已经推出的古老异步编程模式,此模式基于IAsyncResult接口实现。  随着技术的发展,又在“.NET1.0异步编程模型(APM)”之后推出了“.NET2.0基于事件的编程模式”及“.NET4.X...

    C#异步编程概述

    Windows 应用程序编程中常见的一个模式就是,在GUI用户界面下,将耗时的文件和网络处理放入 子线程,以避免用户界面不能响应的问题。在.NET出现以前,创建线 程并监视线程结束,还要更新 界面等工作,即复杂又要手写...

    异步调用03-轮询异步调用是否完成-c#

    可以使用由BeginInvoke方法返回的IAsyncResult的IsCompleted属性来发现异步调用何时完成。从用户界面的服务线程中进行异步调用时可以执行此操作。轮询完成允许调用线程在异步调用在线程池线程上执行时继续执行。 ...

    C# 异步编程 AsyncCallback委托

    异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)

    CS监听模式ReceiveCallBack(IAsyncResult AR)

    本软件是使用套接字、ReceiveCallBack(IAsyncResult AR)函数为例的客服实例,修正了关闭客户端会导致异常的Bug;并且还是一个RichTextBox颜色使用的范例,不同的事件使用不同的颜色:如用户登录用红色、用户名用绿色...

    TCPIP通讯程序的编写

    讨论基于 IAsyncResult 的异步设计模式,此模式提供灵活的处理异步操作的编程模型。 使用 IAsyncResult 调用异步方法 提供代码示例,演示应用程序检测异步操作结束的各种方式。 使用委托进行异步编程 介绍以...

    异步多线程调用IAsyncResult

    异步方法执行,使用BeginInvoke (AsyncCallback委托对象) ,而不用返回值

    异步编程:基于事件的异步编程模式(EMP)

    上一篇,我给大家介绍了“.NET1.0中基于IAsyncResult设计模式的异步编程模型(APM)”,它使用System.Threading命名空间的类来构造多线程应用程序。然而要想有效地使用这些工具类,需要有丰富的使用多线程软件工程的...

    System.IAsyncResult 例子

    //AsyncCallback 为客户端应用程序提供完成异步操作的方法。开始异步操作时,该回调委托被提供给客户端。AsyncCallback 引用的事件处理程序包含完成...//AsyncCallback 使用 IAsyncResult 接口获取异步操作的状态。

    异步调用实例02-AsyncWaitHandle-c#

    可以使用BeginInvoke方法返回的IAsyncResult的AsyncWaitHandle属性来获取WaitHandle。异步调用完成时会发出WaitHandle信号,可以通过调用WaitOne方法来等待它。 如果使用WaitHandle,则在异步调用完成之前或之后,...

    C#异步回调算法

    当异步方法执行完成时,工作线程调用回调方法而不只直接回到线程池中,要实现回调方法,我们必须在使用beginInvoke()方法的时候指定一个参数为IAsyncResult类型的方法,因为在 AsyncResult是一个.Net中已经定义好...

    E03-AsyncChat.zip_client IAsyncResult_聊天系统

    异步TCP聊天系统,有客户端和用户端,实现监听传输信息。

    Socket异步服务器源码

    Socket异步服务器开发源码,只需要把ip和端接口号换掉就可以接收数据。

    基于TCP异步Socket模型的介绍

    TCP异步Socket模型C#的TCP异步Socket模型是通过Begin-End模式实现的。例如提供BeginConnect、BeginAccept、 BeginSend 和 BeginReceive等。 代码如下:IAsyncResult BeginAccept(AsyncCallback callback, object ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...

    CLR.via.C#.(中文第3版)(自制详细书签)

    27.2 CLR的异步编程模型(APM) 27.3 AsyncEnumerator类 27.4 APM和异常 27.5 应用程序及其线程处理模型 27.6 异步实现服务器 27.7 APM和计算限制操作 27.8 APM的注意事项 27.8.1 在没有线程池的前提下使用APM ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    · 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...

    使用异步方式调用同步方法(实例详解)

    说明: .NET Compact Framework 中不支持异步委托调用,也就是 BeginInvoke 和 EndInvoke 方法。...BeginInvoke 返回一个可用于监视异步调用进度的 IAsyncResult。 EndInvoke 方法检索异步调用的结果。在调用 Beg

Global site tag (gtag.js) - Google Analytics