• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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>

 

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Asp.net中,从弹出窗体取选择值(转)发布时间:2022-07-10
下一篇:
EF代码首先与ASP.NETMVC3工具更新和数据脚本发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap