简单的异步调用

有好多与复杂数据操作,IO读写,发Mail等操作需要用户等待,这样用户体验是十分不好的,我们可以把用户不需要知道的东西隐藏起来(通过异步调用),提高页面的执行时间.
    Asp.Net接收到一个页面请求时,会从一个线程池中获取一个线程,并将页面请求分配给该线程。一个普通的,或者说是同步的页面在请求期间会占用线程,以防止线程被用于处理其他请求。如果同步请求变为 I/O 密集状态,例如,当该请求调用一个远程 Web 服务或查询远程数据库并等待调用返回时,则分配给它的线程在调用返回前会始终处于闲置状态。这种情况会限制可伸缩性,因为线程池中的可用线程是有限的。如果处理请求的所有线程都因等待 I/O 操作的完成而阻塞,则会有多余的请求排队等待这些线程的释放。最好的情况是出现吞吐量降低,因为需要等待更长的等待才能处理请求。最糟糕的情况是队列被填满而 ASP.NET 无法处理后续请求,并提示 503“服务器不可用”错误。
     asp.net异步调用为解决 I/O 密集型的请求所导致的此类问题提供了简洁的方案。页面处理要在线程池中的一个线程上进行,但是当一个异步 I/O 操作响应来自 ASP.NET 的信号并开始进行时,该线程会返回原先的线程池。操作完成后,ASP.NET 会从线程池中获取另一个线程来完成处理请求。这样,线程池的线程使用率得到提高,可伸缩性也因此得以增强。那些本来要等待 I/O 操作完成而阻塞的线程此时可以用于处理其他请求。这样做的直接好处就是避免请求执行冗长的 I/O 操作,因此可以快速进出管道。等待进入管道的时间过长会对此类请求的执行造成的很大的负面影响。(以上来自网络)
  在asp.net中存在多种异步调用机制,包括异步页面,异步委托等.下面简单说下自己在开发中使用的异步委托调用.
   首先声明一个委托,eg: 
程序代码
private delegate void AsyncSendMailDel(int userid);
其中的参数是我们在程序中用到的,可以根据自己的情况而定.
给委托添加一个事件:
   
程序代码
 /// <summary>
        /// 开始异步调用
        /// </summary>
        /// <param name="userid"></param>
        /// <param name="subject"></param>
        /// <param name="content"></param>
        public static void AsyncSendMail(int userid)
        {
            AsyncSendMailDel del = new AsyncSendMailDel(SendMailByUserId);
            del.BeginInvoke(userid,new AsyncCallback(CallbackMethod), del);
        }

.BeginInvoke里面第一个参数为委托绑定事件的参数,可以没有,也可以多个,根据自己声明的委托参数而定.CallbackMethod异步执行完后调用的方法(类似回调函数),最后一个参数,把委托对象本身传进去.
程序代码
  /// <summary>
        /// 批处理异步调用完成时的回调函数 
        /// </summary>
        /// <param name="ar"></param>
        internal static void CallbackMethod(IAsyncResult ar)
        {
            //得到异步方法的代理 
             AsyncSendMailDel dlgt = (AsyncSendMailDel)(ar as AsyncResult).AsyncDelegate;
            dlgt.EndInvoke(ar);
        }

可以理解为回收线程作用.

     用到异步的时候需要花费线程开销的,所以用的时候需要取舍,一般用在后台,操作不是特别频繁的.( 不对的地方欢迎跟帖.)   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值