你的位置:首页 > ASP.net教程

[ASP.net教程]封装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"特性。

看一下最终的效果:

image

前台随便敲了点样式:

<div >
    <h6>Test Async</h6>
    <p >
    <asp:Literal ID="ltlResult" runat="server"></asp:Literal>
        </p>
</div>

 

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




华东旅游团报价什么时候去华东旅游最好去华东旅游最佳路线华东旅游景点推荐华东跟团旅游报价多少北大壶滑雪场门票价格_2015北大湖滑雪场票价多少钱 长白山天池门票价格_吉林延边长白山天池山景区门票优惠政策 达古冰川旅游注意事项 悉尼是哪个国家 第14届海峡两岸旅行业联谊会开幕 四川新春旅游季完美收官 福建构建两岸一程多站旅游圈 松潘古城 马尔代夫旅游潜水注意事项?浮潜三宝是指什么? 去泰国旅游要多少钱? 去泰国旅游的费用,如何办理手续? 去马尔代夫旅游价格多少钱,报价在10000左右的岛屿有哪些? 深圳市义工去东部华侨城免费吗?深圳东部华侨城哪些免费?_东部华侨城旅游攻略_东部华侨城旅游景点 陕西最美赏秋地推荐少华山_华山旅游攻略_华山旅游景点 2015深圳东部华侨城万圣节活动有哪些?东部华侨城万圣节有什么活动?_东部华侨城旅游攻略_东部华侨城旅游景点 2015深圳海洋世界门票多少钱?深圳小梅沙小孩子要门票吗?_海洋世界旅游攻略_海洋世界旅游景点 MURD620CTTRL Datasheet MURD620CTTRL Datasheet MURD620CTTR Datasheet MURD620CTTR Datasheet MURD620CTTRR Datasheet MURD620CTTRR Datasheet 去香港迪斯尼 去香港迪斯尼 去香港迪斯尼 东莞松山湖攻略 东莞松山湖攻略 东莞松山湖攻略 温泉旅游攻略 温泉旅游攻略 温泉旅游攻略