当前位置: 首页 > news >正文

封装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 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

转载于:https://www.cnblogs.com/12taotie21/p/4385481.html

相关文章:

  • Solr入门之SolrServer实例化方式
  • matlab mex 小o -o 出错
  • linux下的权限控制
  • java项目在linux上的运行
  • Dev的WPF控件与VS2012不兼容问题
  • [转]ARM Linux 3.x Device Tree Usage
  • AutoFac使用方法总结
  • malloc/free和new/delete的异同
  • java 下载spring的方法
  • Delphi项目构成之窗体文件(Form Files).DFM
  • quartz定时任务框架调度机制解析
  • 图片文件,图片文件流和BASE64加密字符串之间的转换,以及图片的BASE64加密字符串再jsp上如何显示...
  • 字符串处理函数的自定义函数实现
  • 判断两个链表是否相交(不带环)
  • 多线程 异步调用委托
  • (三)从jvm层面了解线程的启动和停止
  • 《深入 React 技术栈》
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • canvas 高仿 Apple Watch 表盘
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • cookie和session
  • css布局,左右固定中间自适应实现
  • CSS相对定位
  • echarts花样作死的坑
  • es6--symbol
  • FastReport在线报表设计器工作原理
  • HTML5新特性总结
  • Javascript编码规范
  • js递归,无限分级树形折叠菜单
  • WePY 在小程序性能调优上做出的探究
  • 从伪并行的 Python 多线程说起
  • 机器学习中为什么要做归一化normalization
  • 离散点最小(凸)包围边界查找
  • 前端_面试
  • 悄悄地说一个bug
  • 携程小程序初体验
  • 以太坊客户端Geth命令参数详解
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 翻译 | The Principles of OOD 面向对象设计原则
  • # centos7下FFmpeg环境部署记录
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (四) Graphivz 颜色选择
  • (学习日记)2024.01.09
  • .NET Core 项目指定SDK版本
  • .NET Core中Emit的使用
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项