[技术回顾系列]-- 异步调用WebService
2007-01-11 09:31
357 查看
通常的WEB服务中对WEB方法的调用都是在客户端发出请求后将一直等待,直到得到返回的结果为止,这样如果某些WEB方法的处理需要很长一段时间才能处理完成的话,将会大大降低程序的效率。但是如果采用异步调用的方式将能使这个问题得到有效的解决,让客户端在发出请求之后的等待时间里去做其他的事情而不是一直在那里呆呆在等待。
对异步调用的理解:
说白了异步调用其实就是调用者线程和执行被调用过程的线程并行执行。
实现WEB服务方法异步调用有四种方法可以实现
使用回调
使用这种方式来进行WEB服务方法的异步调用关键是在启动异步调用时传入一个代理实例作为调用结束时的回调方法。这样用以回调的方法调用结束异步调用的方法获得异步调用的结果。若调用方要跟异步调用同步,则需要在启动异步调用时传入一个同步对象[作为最后一个参数],然后在回调方法中通过IAsyncResult的AsyncState成员获得该对象。
举一个例子:
假如有下面一个WEB服务方法
[webmethod]
public string GetName(string name)
{return name;}
/*****************客户端调用**************************
class Client
{
localhost1.Serivice service=new localhost1.Service();
public void GetResults(IAsyncResult ar)
{
MannualResetEvent ent;
ent=(MannualResetEvent)ar.AsyncState;
string ret=service.EndGetName(ar);
Console.WriteLine("the result is:"+ret);
ent.Set();
}
public void CallWithBack()
{
string name="kim";
AsyncCallBack callBack;
callBack=new AsyncCallBack(GetResults);
MannualResetEvent ent=MannualResetEvent(false);
service.BeginGetName(name,callBack,ent);
//做其他的事情
ent.WaitOne();
}
static void Main(string[] ars)
{
CallWithBack();
}
}
第二种方法使用轮询
轮询就是不断检查异步调用启动后获得的IasyncResult变量的IsCompleted属性,以等待异步调用结束。而一般在判断异步调用还未结束时,调用Thread类的静态方法Sleep(0)迫使当前线程由运行状态转入就绪状态。
如:
WEB服务方法还是以上面的例子为例:
客户端实现:
Class Client
{
localhost1.Serivice service=new localhost1.Service();
public void CallWithQuery()
{
string name="kim";
IasyncResult ar;
ar=service.BeginGetName(name,null,null);
while(!ar.IsCompleted)
{
//做其他事情
Console.WritleLine("Watting....");
Tread.Sleep(0);
}
string ret;
ret=service.EndGetName(ar);
Console.WriteLine("the result is:"+ret);
}
static void Main(string[] ars)
{
CallWithQuery();
}
}
第三种方法是:开始调用,结束调用
这种方式在启动异步调用后用结束异步调用的方式获取结果,如果异步调用没有结束,当前线成被阻塞。
如:
WEB服务方法还是以上面的例子为例:
客户端实现:
Class Client
{
localhost1.Serivice service=new localhost1.Service();
public void CallWithEnd()
{
string name="kim";
IasyncResult ar=service.BeginGetName(name,null,null);
string ret=service.EndGetName(ar);
Console.WriteLine("the result is:"+ret);
}
static void Main(string[] ars)
{
CallWithEnd();
}
}
最后一种方法是:开始调用,等待处理,结束调用
在我们启动异步调用后,客户获得了返回的IasyncResult成员,调用线成在IasyncResult 的AsyncWaitHandle属性表示的同步对象上等待,最后结束异步调用以获得结果。
如:
WEB服务方法还是以上面的例子为例:
客户端实现:
Class Client
{
localhost1.Serivice service=new localhost1.Service();
public void CallWithWaitEnd()
{
string name="kim";
IasyncResult ar=service.BeginGetName(name,null,null);
string ret;
//做其他事情
if(ar.AsyncWaitHandle.WaitOne(1000,false))
{
Console.WriteLine("Invoke over");
ret=service.EndGetName(ar);
}
else
{
Console.WriteLine("Continue watting...");
ret=service.EndGetName(ar);
Console.WriteLine("Invoke over");
}
Console.WriteLine("the result is:"+ret);
}
static void Main(string[] ars)
{
CallWithWaitEnd();
}
}
ps: 在产生的代理类中系统已经自动为我们创建了异步调用接口,不需要我们去再次实现。如Begin***,End***等。如上面的WEB方法GetName在代理类中的异步接口应该是下面这样:
public System.IasyncResult BeginGetName(string name,System.AsycnCallback callback,object asyncState)
public string EndGetName(System.IasyncResult reult)
对于其他的函数可以查阅MSDN
对异步调用的理解:
说白了异步调用其实就是调用者线程和执行被调用过程的线程并行执行。
实现WEB服务方法异步调用有四种方法可以实现
使用回调
使用这种方式来进行WEB服务方法的异步调用关键是在启动异步调用时传入一个代理实例作为调用结束时的回调方法。这样用以回调的方法调用结束异步调用的方法获得异步调用的结果。若调用方要跟异步调用同步,则需要在启动异步调用时传入一个同步对象[作为最后一个参数],然后在回调方法中通过IAsyncResult的AsyncState成员获得该对象。
举一个例子:
假如有下面一个WEB服务方法
[webmethod]
public string GetName(string name)
{return name;}
/*****************客户端调用**************************
class Client
{
localhost1.Serivice service=new localhost1.Service();
public void GetResults(IAsyncResult ar)
{
MannualResetEvent ent;
ent=(MannualResetEvent)ar.AsyncState;
string ret=service.EndGetName(ar);
Console.WriteLine("the result is:"+ret);
ent.Set();
}
public void CallWithBack()
{
string name="kim";
AsyncCallBack callBack;
callBack=new AsyncCallBack(GetResults);
MannualResetEvent ent=MannualResetEvent(false);
service.BeginGetName(name,callBack,ent);
//做其他的事情
ent.WaitOne();
}
static void Main(string[] ars)
{
CallWithBack();
}
}
第二种方法使用轮询
轮询就是不断检查异步调用启动后获得的IasyncResult变量的IsCompleted属性,以等待异步调用结束。而一般在判断异步调用还未结束时,调用Thread类的静态方法Sleep(0)迫使当前线程由运行状态转入就绪状态。
如:
WEB服务方法还是以上面的例子为例:
客户端实现:
Class Client
{
localhost1.Serivice service=new localhost1.Service();
public void CallWithQuery()
{
string name="kim";
IasyncResult ar;
ar=service.BeginGetName(name,null,null);
while(!ar.IsCompleted)
{
//做其他事情
Console.WritleLine("Watting....");
Tread.Sleep(0);
}
string ret;
ret=service.EndGetName(ar);
Console.WriteLine("the result is:"+ret);
}
static void Main(string[] ars)
{
CallWithQuery();
}
}
第三种方法是:开始调用,结束调用
这种方式在启动异步调用后用结束异步调用的方式获取结果,如果异步调用没有结束,当前线成被阻塞。
如:
WEB服务方法还是以上面的例子为例:
客户端实现:
Class Client
{
localhost1.Serivice service=new localhost1.Service();
public void CallWithEnd()
{
string name="kim";
IasyncResult ar=service.BeginGetName(name,null,null);
string ret=service.EndGetName(ar);
Console.WriteLine("the result is:"+ret);
}
static void Main(string[] ars)
{
CallWithEnd();
}
}
最后一种方法是:开始调用,等待处理,结束调用
在我们启动异步调用后,客户获得了返回的IasyncResult成员,调用线成在IasyncResult 的AsyncWaitHandle属性表示的同步对象上等待,最后结束异步调用以获得结果。
如:
WEB服务方法还是以上面的例子为例:
客户端实现:
Class Client
{
localhost1.Serivice service=new localhost1.Service();
public void CallWithWaitEnd()
{
string name="kim";
IasyncResult ar=service.BeginGetName(name,null,null);
string ret;
//做其他事情
if(ar.AsyncWaitHandle.WaitOne(1000,false))
{
Console.WriteLine("Invoke over");
ret=service.EndGetName(ar);
}
else
{
Console.WriteLine("Continue watting...");
ret=service.EndGetName(ar);
Console.WriteLine("Invoke over");
}
Console.WriteLine("the result is:"+ret);
}
static void Main(string[] ars)
{
CallWithWaitEnd();
}
}
ps: 在产生的代理类中系统已经自动为我们创建了异步调用接口,不需要我们去再次实现。如Begin***,End***等。如上面的WEB方法GetName在代理类中的异步接口应该是下面这样:
public System.IasyncResult BeginGetName(string name,System.AsycnCallback callback,object asyncState)
public string EndGetName(System.IasyncResult reult)
对于其他的函数可以查阅MSDN
相关文章推荐
- 近两年项目回顾系列——Flex调用WebService接口
- [技术回顾系列]--如何考虑WebService的安全性[一]
- [技术回顾系列]--WebService事务处理
- WebService之Axis2系列教程(七)异步调用WebService
- [技术回顾系列]--认识WebService全貌
- .net知识系列之九:分布式开发(xml webservice介绍和服务器开发,异步调用)
- 智能客户端应用学习系列:SmartClient Software factory中的Composite UI Application Block(Cab)技术了解(十):异步调用,离线处理,队列管理的关系
- 异步webservice调用
- C#远程调用技术WebService葵花宝典
- Silverlight实用窍门系列:22.Silverlight使用WebService调用C++,Delphi编写的DLL文件【实例源码下载】
- ASP.NET中异步调用WebService方式!
- 异步调用webservice
- 使用异步方式调用WebService
- Ajax技术概要复习及使用Ajax调用jsp或servlet进行异步验证
- jQuery dialog 异步调用ashx,webservice数据
- 蛙蛙推荐:如何编写异步的WebService(不是异步调用WebService)
- Lostinet作品:JScriptSoapClientv0.20Beta简单地异步调用你的WebService
- .net 异步调用webservice 并取得Webservice返回结果
- 异步调用WebService抛出ArgumentException"异步处理过程中出现错误。未完成的多个异步并发操作需要唯一的状态对象"
- C# 中async await 语法 异步调用WebService