封装WebService的APM为Async、Await模式利于Asp.Net页面调用

Wcf针对Async、Await指令直接可以返回Task<T>结果,但是老旧的系统中还是会有很多是在用Soap的Webservice。直接在Asp.Net页面调用APM方法确实比较麻烦,其实可以直接用TaskFactory封装APM模式为.Net4.5的async await模式,便于页面调用。

下面上实现代码,不多废话,注意注释:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Services.Protocols;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class _Default : Page
    {
        protected async void Page_Load(object sender, EventArgs e)
        {
            //这里不直接用AsyncWebService而用父类SoapHttpClientProtocol的原因是:以后可以针对不同的webservice复用
            SoapHttpClientProtocol soapHttpClient = new global::AsyncWebService("http://localhost:3115/AsyncWebService.asmx");

            //反射创建APM方法异步委托
            var beginFunc = soapHttpClient.GetType()
                .GetMethod("BeginHelloWorld")
                .CreateDelegate(typeof(Func<string, System.AsyncCallback, object, IAsyncResult>), soapHttpClient) as Func<string, System.AsyncCallback, object, IAsyncResult>;
            var endFunc = soapHttpClient.GetType()
                .GetMethod("EndHelloWorld")
                .CreateDelegate(typeof(Func<IAsyncResult, string>), soapHttpClient) as Func<IAsyncResult, string>;

            //打印一下调用异步前线程ID
            StringBuilder sb = new StringBuilder();
            sb.Append("<br />");
            sb.Append("Befort Thread Id:" + Thread.CurrentThread.ManagedThreadId);
            sb.Append("<br />");

            //用TaskFactory封装APM模式为.Net4.5的async await模式
            string result = await Task<string>.Factory.FromAsync<string>(beginFunc,
                endFunc, "zhang san", null);

            //打印一下调用异步后线程ID
            sb.Append("After Thread Id:" + Thread.CurrentThread.ManagedThreadId);
            sb.Append("<br />");

            sb.Append(result);

            ltlResult.Text = sb.ToString();
        }
    }
}

注意需要在Aspx前台启用Async="true"特性。

看一下最终的效果:

前台随便敲了点样式:

<div style="padding: 0;background-color: black;color: white;height:100%;width: 100%;margin: 0 auto;font-size:xx-large;">
    <h6>Test Async</h6>

<p style="color: yellow;">

<asp:Literal ID="ltlResult" runat="server"></asp:Literal>

</p>

</div>

本文代码:http://files.cnblogs.com/files/12taotie21/WebApplication1.rar

时间: 2024-07-28 13:18:09

封装WebService的APM为Async、Await模式利于Asp.Net页面调用的相关文章

ASP.NET 上的 Async/Await 简介

原文链接 大多数有关 async/await 的在线资源假定您正在开发客户端应用程序,但在服务器上有 async 的位置吗?可以非常肯定地回答“有”.本文是对 ASP.NET 上异步请求的概念性概述,并提供了对最佳在线资源的引用.我不打算介绍 async 或 await 的语法:因为我已经在一篇介绍性的博客文章 ( bit.ly/19IkogW) 以及一篇关于 async 最佳做法的文章 ( msdn.microsoft.com/magazine/jj991977) 中介绍过了.本文将特别重点介

微信小程序捕获async/await函数异常实践

背景 我们的小程序项目的构建是与web项目保持一致的,完全使用webpack的生态来构建,没有使用小程序自带的构建功能,那么就需要我们配置代码转换的babel插件如Promise.Proxy等:另外,项目中涉及到异步的功能我们统一使用async/await来处理.我们知道,小程序的onError 生命周期只能捕获同步错误,而完全不采用小程序自带构建工具的情况下,开发模式下遇到的问题: 小程序异步代码中的异常onError无法捕获,开发者工具控制台也没有抛出异常信息 这样在开发过程中页面展示异常,

vue项目使用async await 封装 axios

es8的async await让异步变成了同步的写法,在vue中,可以通过封装axios,使得所有的请求都可以使用同步的写法. 新建一个api.js文件,全局创建api实例 import axios from 'axios' const qs = require('qs') const api = { async get (url, data) { try { let res = await axios.get(url, {params: data}) res = res.data return

node.js异步控制流程 回调,事件,promise和async/await

写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观. 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用. 接下来是解析,为什么我会有这样的结论 首先是回调,理解上最简单,就是我把任务分配出去,当你执行完了我就能从你那里拿到结果执行相应的回调, 这里演示一个对setTimeout的封装,规定时间后打印相应结果并执行回调函数 并且这个函数传给回调函数的参数符合node标准,第一个为error信息,如果出错e

[.NET] 利用 async &amp; await 的异步编程

利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异步提高响应能力 更容易编写的异步方法 异步方法的控制流 线程 async 和 await 返回类型和参数信息 命名的约定 一.异步编程的简介 通过使用异步编程,你可以避免性能瓶颈并增强应用程序的总体响应能力. Visual Studio 2012 引入了一个简化的方法,异步编程,在 .NET Framewo

从地狱到天堂,Node 回调向 async/await 转变

Node7.6 开始正式支持 async/await,而 async/await 由于其可以以同步形式的代码书写异步程序,被喻为异步调用的天堂.然而 Node 的回调模式在已经根深蒂固,这个被喻为"回调地狱"的结构形式推动了 Promise 和 ES6 的迅速成型.然而,从地狱到天堂,并非一步之遥! async/await 基于 Promise,而不是基于回调,所以要想从回调地狱中解脱出来,首先要把回调实现修改为 Promise 实现--问题来了,Node 这么多库函数,还有更多的第三

从不用 try-catch 实现的 async/await 语法说错误处理

前不久看到 Dima Grossman 写的 How to write async await without try-catch blocks in Javascript.看到标题的时候,我感到非常好奇.我知道虽然在异步程序中可以不使用 try-catch 配合 async/await 来处理错误,但是处理方式并不能与 async/await 配合得很好,所以很想知道到底有什么办法会比 try-catch 更好用. Dima 去除 try-catch 的方法 当然套路依旧,Dima 讲到了回调

async/await使用深入详解

async和await作为异步模型代码编写的语法糖已经提供了一段时间不过一直没怎么用,由于最近需要在BeetleX webapi中集成对Task方法的支持,所以对async和await有了深入的了解和实践应用.在这总结一下async和await的使用,主要涉及到:自定义Awaitable,在传统异步方法中集成Task,异常处理等. 介绍 在传统异步方法处理都是通过指定回调函数的方式来进行处理,这样对于业务整非常不方便.毕竟业务信息和状态往往涉及到多个异步回调,这样业务实现和调试成本都非常高.为了

.net 异步编程async &amp; await关键字的思考

C# 5.0引入了两个关键字 async和await,这两个关键字在很大程度上帮助我们简化了异步编程的实现代码,而且TPL中的task与async和await有很大的关系 思考了一下异步编程中的async & await关键字,对两个关键字尤其是await关键字一直很迷糊,因此深入思考了一下.首先借助的示例是:[你必须知道的异步编程]C# 5.0 新特性--Async和Await使异步编程更简单这是博客园一个大牛写的,自己也一直关注这个大神,不得不说,博客园大神很多,而且氛围也很好.我引入了其中