博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.net异步调用WebService的三种方式--zt
阅读量:4689 次
发布时间:2019-06-09

本文共 4191 字,大约阅读时间需要 13 分钟。

 
 
.net异步调用WebService的三种方式 - fly - fly

 

.net异步调用WebService的三种方式 - fly - fly

 

===WebService ===

using System.Threading;

/// <summary>

///YiBuDiaoYongWebService 的摘要说明
/// </summary>
[WebService(Namespace = "")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
//若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class YiBuDiaoYongWebService : System.Web.Services.WebService {

    public YiBuDiaoYongWebService () {

        //如果使用设计的组件,请取消注释以下行

        //InitializeComponent();
    }

   [WebMethod]

    public string HelloWorld1()
   {
        Thread.Sleep(2000); //停留2秒.
        return "页面异步调用webservice成功!";
    }

}

===Web页面 ===

    <form id="form1" runat="server">

    <div>
        <br />
        &nbsp;<asp:Button ID="BeginEndCallBackButton" runat="server"
            Text="Begin/End 模式回调技术" οnclick="BeginEndCallBackButton_Click" />
        <br />
        <br />
        <asp:Button ID="BeginEndWaitButton" runat="server" Text="Begin/End 模式等待技术"
            οnclick="BeginEndWaitButton_Click" />
        <br />
        <br />
        <asp:Button ID="EventDriveButton" runat="server" Text="事件驱动的异步模式"
            οnclick="EventDriveButton_Click" />
    </div>
    </form>

 

using System.Threading;

using LocalService;//web引用名

public partial class WebYiBuDiaoYongWebService : System.Web.UI.Page

{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    /**/

    /// <summary>
    /// 第一种方式:使用 Begin/End 模式的回调技术
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void BeginEndCallBackButton_Click(object sender, EventArgs e)
    {
        Response.Write("Begin/End 模式的回调技术<BR>");
        LocalService.YiBuDiaoYongWebService localService = new LocalService.YiBuDiaoYongWebService(); //创建代理类对象。
        Response.Write(string.Format("开始调用时间:{0}<Br>", DateTime.Now.ToString("mm:ss.ffff")));//开始调用事件
        IAsyncResult ar = localService.BeginHelloWorld1(helloWorldCallBack, localService);
        Response.Write(string.Format("调用结束时间:{0}<Br>", DateTime.Now.ToString("mm:ss.ffff")));
        while (!ar.IsCompleted) { }//空循环等待完成
    }
    private void helloWorldCallBack(IAsyncResult ar)
    {
        LocalService.YiBuDiaoYongWebService ws = (LocalService.YiBuDiaoYongWebService)ar.AsyncState;
        string result = ws.EndHelloWorld1(ar);
        Response.Write(string.Format("完成时间:{0}。 结果{1}<Br>", DateTime.Now.ToString("mm:ss.ffff"), result));
    }

    /**/

    /// <summary>
    /// 第二种方式:使用 Begin/End 模式的等待技术
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void BeginEndWaitButton_Click(object sender, EventArgs e)
    {
        LocalService.YiBuDiaoYongWebService localService = new LocalService.YiBuDiaoYongWebService(); //创建代理类对象。
        Response.Write("Begin/End 模式的等待技术<BR>");
        Response.Write(string.Format("开始调用时间:{0}<Br>", DateTime.Now.ToString("mm:ss.ffff")));//开始调用事件
        IAsyncResult ar = localService.BeginHelloWorld1(s => { }, null);
        Response.Write(string.Format("调用结束时间:{0}<Br>", DateTime.Now.ToString("mm:ss.ffff")));
        ar.AsyncWaitHandle.WaitOne();
        string result = localService.EndHelloWorld1(ar);
        Response.Write(string.Format("完成时间:{0}。 结果{1}<Br>", DateTime.Now.ToString("mm:ss.ffff"), result));
    }

    /** <summary>

    /// 第三种方式:事件驱动的异步模式的异步
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void EventDriveButton_Click(object sender, EventArgs e)
    {
        Response.Write("事件驱动的异步模式的异步 <BR>");
        LocalService.YiBuDiaoYongWebService localService = new LocalService.YiBuDiaoYongWebService(); //创建代理类对象。
        localService.HelloWorld1Completed += new LocalService.HelloWorld1CompletedEventHandler((o, a) => { Response.Write(string.Format("完成时间:{0}。 结果{1}<Br>", DateTime.Now.ToString("mm:ss.ffff"), a.Result)); });//创建事件。写结果与运行事件
        Response.Write(string.Format("开始调用时间:{0}<Br>", DateTime.Now.ToString("mm:ss.ffff")));//开始调用事件
        localService.HelloWorld1Async();//异步调用
        Response.Write(string.Format("调用结束时间:{0}<Br>", DateTime.Now.ToString("mm:ss.ffff")));  
        Thread.Sleep(4000);//等待异步操作完成
    }

}

 

此內容中不允許非同步作業。啟動非同步作業的網頁必須將 Async 屬性設定為 true,而且只能在 PreRenderComplete 事件之前啟動非同步作業。

   於 System.Web.AspNetSynchronizationContext.OperationStarted()
   於 System.Net.WebClient.OpenWriteAsync(Uri address, String method, Object userToken)
   於 System.Net.WebClient.OpenWriteAsync(Uri address)

 

 

原來是要在.aspx 第一行加上一屬性敘述..

 

Async="true"

 

 

使得第一行如下:

 

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Async="true" Inherits="TestASPXUploader._Default" %>

 

 

转载于:https://www.cnblogs.com/Nina-piaoye/archive/2012/10/15/2724330.html

你可能感兴趣的文章
Mybatis逆向工程配置文件详细介绍(转)
查看>>
【转】java事件监听机制
查看>>
数组 Arrays类
查看>>
String类的深入学习与理解
查看>>
OLTP vs OLAP
查看>>
一些题目(3)
查看>>
Eclipse下配置主题颜色
查看>>
杂题 UVAoj 107 The Cat in the Hat
查看>>
ftp sun jdk自带
查看>>
python 元类——metaclass
查看>>
什么是缓冲,引入缓冲的原因是什么?
查看>>
叙述下列术语的定义并说明它们之间的关系:卷、块、文件、记录。
查看>>
不把DB放进容器的理由
查看>>
OnePage收集
查看>>
Java parseInt()方法
查看>>
yahoo的30条优化规则
查看>>
[CCF2015.09]题解
查看>>
[NYIST15]括号匹配(二)(区间dp)
查看>>
json_value.cpp : fatal error C1083: 无法打开编译器生成的文件:No such file or directory
查看>>
洛谷 P1101 单词方阵
查看>>