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

it2022-05-08  13

 

 

===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 />         <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)