.net异步调用WebService的三种方式--zt
![.net异步调用WebService的三种方式 - fly - fly](http://img846.ph.126.net/0W-GospQH1c4w623rOBpkg==/746190163261970411.jpg)
![.net异步调用WebService的三种方式 - fly - fly](http://img.ph.126.net/8z-RdF7xWAzE54EiOO0pVQ==/2359886204742838075.jpg)
===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 模式回调技术" onclick="BeginEndCallBackButton_Click" />
<br />
<br />
<asp:Button ID="BeginEndWaitButton" runat="server" Text="Begin/End 模式等待技术"
onclick="BeginEndWaitButton_Click" />
<br />
<br />
<asp:Button ID="EventDriveButton" runat="server" Text="事件驱动的异步模式"
onclick="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" %>