`

关于.NET异步调用的初步总结

阅读更多

最近看了看.NET异步调用方面的资料,现择重点总结,若有纰漏敬请指正。


异步调用的实质:

异步调用通过委托将所需调用的方法置于一个新线程上运行,从而能够使一个可能需要较长时间的任务在后台执行而不影响调用方的其他行为。

异步调用的实现:

前面已经讲道,异步调用通过委托实现。委托支持同步和异步调用。在同步调用中,一个委托的实例可记录多个目标方法;在异步调用中,一个委托实例中有且只能包含一个目标方法。异步调用使用委托实例的BeginInvoke方法和EndInvoke方法分别开始调用和检索返回值,这两个方法在编译期生成。调用BeginInvoke后委托立即返回;调用EndInvoke时倘若委托方法未执行完毕,则阻塞当前线程至调用完毕。
假设有一个委托

public delegate int ASyncHandler(int a, string b, ref string c);


那么,其BeginInvoke与EndInvoke的形式如下:

public IAsyncResult BeginInvoke(int a, string b, ref string c, AsyncCallback callback, object asyncState);

public int EndInvoke(ref string c, IAsyncResult asyncResult);


也就是说,BeginInvoke与EndInvoke的参数列表与当前委托签名有关,可以总结为:

public IAsyncResult BeginInvoke(委托所具有的全部参数,AsyncCallback callback,object asyncState);
public 委托返回值 EndInvoke(委托参数中ref/out部分,IAsyncResult asyncResult);


BeginInvoke返回一个IAsyncResult,其实质是实现IAsyncResult的System.Runtime.Remoting.Messaging.AsyncResult类。该对象相当于一个“凭证”,在调用EndInvoke时用于确认应等待返回的方法(猜测如此)。就像去银行,存钱时拿到一份存折(凭证),取款时依据存折(凭证)取款。
EndInvoke检索委托返回值,并返回标有ref/out的参数值。
IAsyncResult接口声明:

public interface IAsyncResult
{
    object AsyncState { get;}
    WaitHandle AsyncWaitHandle { get;}
    bool CompletedSynchronously { get;}
    bool IsCompleted { get;}
}



等待调用结束的三种方法:

1、使用EndInvoke主动等待异步调用结束。这是最简单的一种方法,适用于非用户界面程序及一些IO操作,因为在调用EndInvoke之后当前线程被阻塞,除了等待什么都不能做。

2、使用WaitHandle等待异步调用结束。IAsyncResult中有WaitHandle成员,获取用于等待异步操作完成的WaitHandle,即调用结束信号。使用WaitHandle.WaitOne()可以阻塞当前线程至异步调用完成。这样做的好处是:在调用WaitOne之后、EndInvoke之前,可以执行其他处理。

3、主动轮询。使用IAsyncResult中有IsCompleted成员检索当前异步调用情况。该方法适用于用户界面程序,想象可在一个循环内做到既等待委托完成,又可以更新用户界面。

4、使用回调,在异步调用结束时执行一个操作。前面的BeginInvoke方法签名的最后两个参数用于回调。需要用到AsyncCallback委托:

public delegate void AsyncCallback(IAsyncResult asyncResult);


回调方法在系统线程池中执行。BeginInvoke的最后一个参数(object asyncState)可以传递包含回调方法将要使用的信息的对象。在回调方法中调用EndInvoke可以通过取得System.Runtime.Remoting.Messaging.AsyncResult.AsyncDelegate实现。

个人认为方法1、2相差不算太大。

先写这么些,以后再补上其他的一些东西。

分享到:
评论

相关推荐

    asp.net ajax初步入门

    学习ASP.NET AJAX时,首先要掌握基本的ASP.NET Web Forms概念,然后理解如何配置ScriptManager,如何使用UpdatePanel实现异步更新,以及如何调用服务器端的方法。AJAX Control Toolkit的使用也是学习的重点,它能...

    asp.net c# 调用百度pai实现在线翻译,英文转中文

    总结起来,ASP.NET C#调用百度Pai进行在线翻译涉及的主要知识点包括: 1. 百度API的注册和API Key的获取。 2. 使用HTTP请求获取网页内容。 3. 正则表达式解析HTML内容。 4. 使用C#发送HTTP请求调用百度翻译API。 5....

    Ajxa.net 使用说明.

    Ajxa.net 支持同步和异步调用,默认是异步的。如果需要同步执行,可以使用 `ExecuteSync()` 方法: ```csharp AjaxResponse response = request.ExecuteSync(); ``` 7. **处理响应状态** Ajxa.net 提供了丰富...

    异步文件传输1.0(修正版)

    在"异步文件传输1.0(修正版)"中,开发者已经进行了初步的测试,但可能仍存在未知的BUG。对于发现的问题,开发者鼓励用户进行反馈,以便进行修复和改进。这种互动方式有助于软件的持续优化和质量提升。 总之,异步...

    C#异步调用的好处和方法分享

    首先,异步出来的新线程,必须回收,不回收是浪费资源的可耻行为,.NET也是不允许的,所以你别想钻空子,俗话说,请神容易送神难,就是这个道理。下面你可以很容易想到,回收分为2种情况:主动回收和被动回收(当然...

    ASP.net.Ajax电子教程

    我们将会学习如何使用PageMethods和WebServices来实现客户端的异步调用,以及如何处理回调结果。 在第一集中,还会涉及AJAX生命周期的理解,包括页面生命周期和UpdatePanel的生命周期,这对于优化性能和调试代码至...

    北京中科信软 Visual Basic.NET培训

    Web Service中的异步调用,状态管理:Web服务中实现异步操作和管理用户会话状态的方法。 事务处理,安全性,自定义身份验证:Web服务中的事务管理、安全性和用户身份验证机制。 Visual Studio Team System中的单元...

    .net仿163上传

    综上所述,这个`.NET仿163上传`项目涵盖了.NET Web开发中的多个重要技术点,包括文件上传、异步处理、安全性、用户体验优化等方面,是学习和实践.NET文件上传功能的一个宝贵资源。通过深入研究和理解这个Demo,...

    第4章 ASP.NET 3.5技术简介

    1. **内置的ASP.NET AJAX支持**:ASP.NET 3.5提供了一系列用于创建AJAX应用程序的服务器控件和客户端脚本库,使得无需JavaScript专家也能构建异步交互的Web应用。 2. **Forms身份验证和角色管理**:新版本增强了...

    ASP.net网络书店

    5. **支付集成**:项目可能集成了第三方支付网关(如PayPal、Alipay或WeChat Pay),ASP.NET提供了API接口调用和异步处理这些支付请求的能力。 6. **页面布局与样式**:ASP.NET MVC支持razor视图引擎,允许开发者...

    ASP.NET.AJAX.in.Action

    - 异步网络调用是 AJAX 技术的核心之一,通过这种方式可以在不重新加载整个页面的情况下与服务器进行通信。 - 开发者将学习如何在 ASP.NET AJAX 中实现异步请求,并处理这些请求的结果。 - **使用 Update Panels ...

    asp.net专家疑难解答200问

    - LINQ to SQL或Entity Framework在ASP.NET 1.0中的初步实践。 5. **状态管理** - 页面状态管理有哪几种方式?如ViewState、Session、Cookie等。 - 各种状态管理方式的优缺点是什么? - 如何在不支持ViewState...

    【ASP.NET编程知识】.Net程序内存异常的原因及解决.docx

    初步分析认为日志组件的设计缺陷是问题的直接原因,日志对象在每个调用类中都进行了重新创建,导致内存消耗增加。 三、思路与解决方案 1. 分析日志堆积原因:日志内容主要为错误信息,如对象为null和转换失败。解决...

    深入.NET平台和C#编程.zip

    2. **元数据与类型系统**:.NET中的每个对象都带有元数据,这使得反射成为可能,可以动态地创建对象和调用方法。 3. **泛型与面向接口编程**:学习如何使用泛型提高代码的复用性和类型安全性,以及如何通过接口实现...

    ASP.NET JQuery无刷新上传附件

    在本场景中,JQuery通过Ajax调用ASP.NET的后台服务,提交文件并接收响应。 4. **HTML5 File API**:JQuery通过HTML5的File API获取用户选择的文件信息,如文件名、大小等,并可以预览或读取文件内容。这使得前端...

    asp.net 3.5 揭秘(卷一) (2/2)源码

    《ASP.NET 3.5 揭秘(卷一)》是一部深入探讨ASP.NET 3.5技术的专业书籍,本资源提供了该书的部分源代码,旨在帮助读者更好地理解和实践书中所讲解的技术。源码分为两部分,便于下载和管理。本文将详细解析这些源码...

    The.ASP.NET.2.0技术选集

    - **并发和异步处理**:讨论多线程编程的最佳实践以及如何利用.NET 2.0提供的新API实现更高效的异步操作。 - **安全性和权限模型**:分析.NET 2.0的安全框架,并给出实际应用中的权限管理建议。 #### 3. 数据访问...

    ASP.NET源码——[博客空间]Fair Blog 1.0.0 Beta.zip

    以上是对 Fair Blog 1.0.0 Beta 作为 ASP.NET 博客系统的初步分析,实际源码中会包含更多细节,如自定义过滤器、邮件服务、RSS 订阅等功能,这些都需要通过阅读源码来进一步理解。通过学习和研究这个项目,开发者...

    支付宝批量付款到支付宝账号接口集成教程_ASP.NET版本

    根据性能需求,可能还需要对代码进行优化,例如批量处理、异步调用等。 9. **安全性和合规性**:在整个过程中,必须遵循支付宝的使用规则和法律法规,确保资金流转的合规性,同时加强用户隐私保护,不泄露敏感信息...

Global site tag (gtag.js) - Google Analytics