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

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

 

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

 

===WebService ===

using System.Threading;

/// <summary>
///YiBuDiaoYongWebService 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值