Wcf針對Async、Await指令直接可以返回Task<T>結(jié)果,但是老舊的系統(tǒng)中還是會有很多是在用Soap的Webservice。直接在Asp.Net頁面調(diào)用APM方法確實比較麻煩,其實可以直接用TaskFactory封裝APM模式為.Net4.5的async await模式,便于頁面調(diào)用。
下面上實現(xiàn)代碼,不多廢話,注意注釋:
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復(fù)用 SoapHttpClientProtocol soapHttpClient = new global::AsyncWebService("http://localhost:3115/AsyncWebService.asmx"); //反射創(chuàng)建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>; //打印一下調(diào)用異步前線程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); //打印一下調(diào)用異步后線程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.VEVb.com/files/12taotie21/WebApplication1.rar
新聞熱點
疑難解答