如何实现webservice的异步调用
对异步调用的理解:
说白了异步调用其实就是调用者线程和执行被调用过程的线程并行执行。
实现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();
}
}