C#异步调⽤WEBSERVICE
1、使⽤事件驱动的异步模式的异步 Web 服务客户端
Web 服务代理类中的每个 Web ⽅法都具有⼀个异步的对应版本。代理类⾃动⽣成每个 Web ⽅法的异步⽅法和对应事件。当异步⽅法被调⽤时,它将在另⼀个线程上执⾏,并在
返回时引发对应的事件。您可以为异步⽅法的对应事件创建⼀个处理程序,从⽽在它返回时执⾏代码。
此模型可以简化⽣成多线程应⽤程序的过程,因为您不必⾃⼰实现复杂的多线程代码。
具体做法:
1、创建MethodCompleted 事件。
private void HelloWorldCompleted(Object sender,
localhost.HelloWorldCompletedEventArgs Completed)
{
// Insert code to implement the method here
}
2、向该事件的处理程序列表添加 MethodCompleted 事件处理程序。
myWebService.HelloWorldCompleted += new localhost.HelloWorldCompletedEventHandler(HelloWorldCompleted);
3、使⽤该⽅法的 MethodAsync 形式调⽤ Web ⽅法.
HelloWorldAsync();
2、使⽤ Begin/End 模式的回调⽅法
具体做法:
定义实现 AsyncCallback 委托的回调函数。
public static void FactorizeCallback(IAsyncResult ar)
实例化 AsyncCallback 委托。
AsyncCallback cb = new AsyncCallback(TestCallback.FactorizeCallback);
调⽤ Begin ⽅法,将回调函数作为第⼆个参数传递,将提供状态的对象(在本⽰例中是 PrimeFactorizer的客户端实现)作为第三个参数传递。
IAsyncResult ar = pf.BeginFactorize(factorizableNum, cb, pf);
在 Begin ⽅法返回的 IAsyncResult 上检查 IsCompleted 属性。如果客户端已收到服务器的响应,该值将设置为 true。
在回调函数中访问状态对象。IAsyncState 参数的 AsyncState 属性将该对象作为第三个参数传递给 Begin⽅法。
PrimeFactorizer pf = (PrimeFactorizer) ar.AsyncState;
在回调函数中,对上⼀步中获取的状态对象调⽤ End ⽅法。
long[] results = pf.EndFactorize(ar);
如果没有Begin/end 的web⽅法:
1. 做为旧的Web Service使⽤(Web Reference)
⽣成的WeatherWebService没有Begin/End⽅法
关闭project后⽤notepad编辑对应csproj⽂件。更改完成后重新打开project,选中Web References下⾯对应的Web Refrence右键菜单中选择“更新
Web引⽤”,更新完后就有Begin/End⽅法了。
1 <?xml version="1.0" encoding="utf-8"?>
2 <Project ToolsVersion="4.0" DefaultTargets="Build"
3
4 xmlns="schemas.microsoft/developer/msbuild/2003">
5 <PropertyGroup>
6 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
7 <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
8 <ProductVersion>8.0.30703</ProductVersion>
9 <SchemaVersion>2.0</SchemaVersion>
10 <ProjectGuid>{DECB98A2-0FC4-46B5-9857-D828F4332E8F}</ProjectGuid>
11 <OutputType>WinExe</OutputType>
12 <WebReference_EnableLegacyEventingModel>true</WebReference_EnableLegacyEventingModel>
13 <AppDesignerFolder>Properties</AppDesignerFolder>
14 <RootNamespace>Test</RootNamespace>
15 <AssemblyName>Test</AssemblyName>
16 <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
17 <TargetFrameworkProfile>Client</TargetFrameworkProfile>
18 <FileAlignment>512</FileAlignment>
19 </PropertyGroup>
20 <!-- 省略掉其他内容 -->
21 </Project>
实例
1、
1///<summary>
2///事件驱动的异步模式的异步
3///</summary>
4///<param name="sender"></param>
5///<param name="e"></param>
6protected void EventDriveButton_Click(object sender, EventArgs e)
7 {
8 Response.Write("事件驱动的异步模式的异步 <BR>");
9 LocalService.WebService localService = new LocalService.WebService(); //创建代理类对象。
10 localService.HelloWorldCompleted += new LocalService.HelloWorldCompletedEventHandler((o, a) => { Response.Write(string.Format("完成时间:{0}。结果{1}<Br>", DateTime.Now.ToString("mm:ss.ffff"), a.Result)); });//创建事件。写结果
11 Response.Write(string.Format("开始调⽤时间:{0}<Br>", DateTime.Now.ToString("mm:ss.ffff")));//开始调⽤事件
12 localService.HelloWorldAsync();//异步调⽤
13 Response.Write(string.Format("调⽤结束时间:{0}<Br>", DateTime.Now.ToString("mm:ss.ffff")));
14 Thread.Sleep(4000);//等待异步操作完成
15 }
2、
调用webservice服务1///<summary>
2///使⽤ Begin/End 模式的回调技术
3///</summary>
4///<param name="sender"></param>
5///<param name="e"></param>
6protected void BeginEndCallBackButton_Click(object sender, EventArgs e)
7 {
8 Response.Write("Begin/End 模式的回调技术<BR>");
9 LocalService.WebService localService = new LocalService.WebService(); //创建代理类对象。
10 Response.Write(string.Format("开始调⽤时间:{0}<Br>", DateTime.Now.ToString("mm:ss.ffff")));//开始调⽤事件
11 IAsyncResult ar = localService.BeginHelloWorld(helloWorldCallBack, localService);
12 Response.Write(string.Format("调⽤结束时间:{0}<Br>", DateTime.Now.ToString("mm:ss.ffff")));
13while (!ar.IsCompleted) { }//空循环等待完成
14 }
15private void helloWorldCallBack(IAsyncResult ar)
16 {
17 LocalService.WebService ws = (LocalService.WebService)ar.AsyncState;
18string result= ws.EndHelloWorld(ar);
19 Response.Write(string.Format("完成时间:{0}。结果{1}<Br>", DateTime.Now.ToString("mm:ss.ffff"), result));
20 }
21 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论