问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何异步调用webservice,异步调用有什么优势1

发布网友 发布时间:2023-09-22 16:40

我来回答

2个回答

热心网友 时间:2024-11-29 10:37

一.异步调用webservice方法:


不管是Winform还是Web调用,都是可以对Webservice进行异步调用的。

方法有两种:

(1)Begin/End方法(虽然被丢弃)。

(2)事件驱动方法。

下面来具体谈谈这两种方法;

1、Begin/End方法

使用 Begin/End 模式实现进行异步方法调用的 Web 服务客户端
客户端如何知道何时调用 End 方法呢?根据 .NET Framework 的定义,有两种方法可以使客户端确定这一点:

客户端调用方式1等待方法:使用 WaitHandle 类的方法之一使客户端等待方法完成。

客户端调用方式2回调方法:向 Begin 方法传递一个回调函数,在该方法完成处理后再调用该函数来检索结果。

注意:无论客户端选择两种方法中的哪一种与 Web 服务进行异步通信,收发的 SOAP 消息都与通过同步代理方法生成的 SOAP 消息相同。也就是说,仍然只有一个 SOAP 请求和 SOAP 响应通过网络发送和接收。代理类通过使用与客户端调用 Begin 方法时使用的线程不同的线程来处理 SOAP 响应,从而实现该目的。因此,在代理类接收和处理 SOAP 响应时,客户端可以在其线程上继续执行其他工作。

webservice代码:

客户端调用方式1(Begin/End 模式的回调方法):

解说(解说来自MSDN):

<!--[if !supportLists]-->
定义实现 AsyncCallback 委托的回调函数。 
public static void FactorizeCallback(IAsyncResult ar)

<!--[if !supportLists]-->
实例化 AsyncCallback 委托。 
<!--[endif]--> 
AsyncCallback cb = new AsyncCallback(TestCallback.FactorizeCallback);

<!--[if !supportLists]--> <!--[endif]-->调用 Begin 方法,将回调函数作为第二个参数传递,将提供状态的对象(在本示例中是 PrimeFactorizer 的客户端实现)作为第三个参数传递。 
IAsyncResult ar = pf.BeginFactorize(factorizableNum, cb, pf);

<!--[if !supportLists]--> <!--[endif]-->在 Begin 方法返回的 IAsyncResult 上检查 IsCompleted 属性。如果客户端已收到服务器的响应,该值将设置为 true。 
<!--[if !supportLists]--> <!--[endif]-->在回调函数中访问状态对象。IAsyncState 参数的 AsyncState 属性将该对象作为第三个参数传递给 Begin 方法。 
PrimeFactorizer pf = (PrimeFactorizer) ar.AsyncState;

<!--[if !supportLists]--> <!--[endif]-->在回调函数中,对上一步中获取的状态对象调用 End 方法。 
long[] results = pf.EndFactorize(ar);


客户端调用方式2(Begin/End 模式的等待方法):

解说(解说来自MSDN):

WaitHandle 类实现下列支持等待同步对象得到信号通知的方法:WaitOne、WaitAny 和 WaitAll。当同步对象得到信号通知时,表示等待指定资源的线程此时可以访问该资源了。Web 服务客户端通过 Begin 方法返回的 IAsyncResult 对象的 AsyncWaitHandle 属性,来访问 WaitHandle 对象。

具体做法:

<!--[if !supportLists]-->1、 <!--[endif]-->Web 服务客户端调用所生成的代理类的 Begin 方法。

IAsyncResult ar = pf.BeginFactorize(factorizableNum, null, null);

<!--[if !supportLists]-->2、 <!--[endif]-->Web 服务客户端通过返回的 IAsyncResult 的 AsyncWaitHandle 属性来访问 WaitHandle 对象。

ar.AsyncWaitHandle.WaitOne()

<!--[if !supportLists]-->3、 <!--[endif]-->等待方法返回后,客户端调用 End 方法来获取结果。

results = pf.EndFactorize(ar);

2、事件驱动方法

解说:

Web 服务代理类中的每个 Web 方法都具有一个异步的对应版本。代理类自动生成每个 Web 方法的异步方法和对应事件。当异步方法被调用时,将在另一个线程上执行,并在返回时引发对应的事件。可以为异步方法的对应事件创建一个处理程序,从而 在返回时执行代码。

此模型可以简化生成多线程应用程序的过程,因为不必自己实现复杂的多线程代码。

具体做法:

<!--[if !supportLists]-->1、 <!--[endif]-->创建MethodCompleted 事件。

private void HelloWorldCompleted(Object sender,

localhost.HelloWorldCompletedEventArgs Completed)

{

// Insert code to implement the method here

}

<!--[if !supportLists]-->2、 <!--[endif]-->向该事件的处理程序列表添加 MethodCompleted 事件处理程序。

myWebService.HelloWorldCompleted += new localhost.HelloWorldCompletedEventHandler(HelloWorldCompleted);<!--[if !supportLists]-->3、 <!--[endif]-->使用该方法的 MethodAsync 形式调用 Web 方法.

HelloWorldAsync();

二.异步调用的优势:

异步出来的新线程,.NET也是不允许的,所以别想钻空子,下面可以很容易想到,回收分为2种情况:主动回收和被动回收,主动回收就是,去监视那个线程,并且等待,当异步方法完成了,就把异步线程回收,焦点回归主线程,BeginInvoke之后又EndInvoke,如果在EndInvoke的时候,该异步线程没有完成操作,那么整个程序,包括主线程,又在阻塞了,又会出现界面的情况。要想解决这个问题,就使用“被动回收”方式,其中一个重要的办法就是“异步回调”。 核心有二: A、 用回调函数,异步结束后,自动调用此回调函数。 B、 而不在主线程中手工等待异步结束,如上两例中在主线程中调用EndInvoke。此种方法,是在回调函数中调用EndInvoke的。



热心网友 时间:2024-11-29 10:37

异步调用webseviced的方法如下:
通常的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
以上。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
膀胱癌医生要为什么要检查上尿路? 游览器书签怎样添加到手机桌面 玫瑰花是早上开还是晚上开 玫瑰是晚上开花吗 左拾遗是什么官左拾遗的解释 怎样炖羊肉好吃又烂 怎样炖羊肉软烂无膻味好吃 ...之心度君子之腹的意思以小人之心度君子之腹的解释以小人之心度君子... 以小人之心度君子之腹什么意思以小人之心度君子之腹出处介绍 苹果macbook pro开机音乐是什么 苹果台式电脑声音苹果电脑开机声音怎么设置 海尔电热水器中es6oh一s52e多少钱1 1997年废钢材什么时候涨价的 .net中webservice是同步调用还是异步调用5 为什么昨天放在京东里的资金今天没收到利益 我想自己组装一个台式机主机,预算资金3500左右,配件全部从京东采购,求... 您好在京东金融贷款上面申请了20000元贷款说是提供卡号错误资金被冻结... 没有手机号怎么登录啊? 初中生适合学心理学吗15 教育学跨专业考心理学博士 新高考报读心理学选什么科目?2 只有没有微信手机号怎么登录呢? 手机号不用了怎么登陆啊? 海尔电热水器es6oh一s5(e)出现fo为什么? 海尔电热es6oh-s5介绍下它的功能10 海尔热水器ES6OH一J丨(E)多少钱10 ios17功能介绍 哪个星座容易出海王 ...房价现在是不是涨得很快,应该入手吗,这附近上下班会不会堵车... 惠州淡水华侨新村的位置偏吗,这附近上下班会不会堵车? 谁最可能是心机女!(1.小时候脾气特好!因为经常同学受欺负!... C# WebService如何设置异步?不是调用,如何把接口... 什么词可以形容广州塔小蛮腰165 描写“广州塔夜晚”的词句有哪些?62 这是什么西瓜,能吃不 个性测试:你的自信需要什么支撑 鼠标有时单击变双击 自己怎么测试鼠标单击32 怎样测试鼠标性能?49 钢筋一吨多少钱一吨 如何测试鼠标11 公民的政治参与程度受哪些因素的影响 政治诚信直接影响着民众的政治参与热情与程度以及政府的政治凝聚... 不正确的政治参与会有什么不良后果 用九键 964694364793是什么意思啊? 广数218mc加工中心机械手怎么手轮移动 名侦探柯南木偶交响曲的游戏相关 9150**异常心电图**6 用几句简单的英文来介绍广州塔1 心里有你陪着我,就不会再寂寞。 我只记得这一句歌词。这首的歌名是什... 如何测试一个鼠标的好坏39 如何测试鼠标1