我有以下两种方法:
private static void webservicecalls()
{
WebServiceOne();
WebServiceTwo();
}
那么如何在调用第二个Web服务之前异步调用这两个方法而不是等待第一个Web服务调用完成呢?
更新
现在,WebSericeOne和WebServiceTwo都有子调用,例如:
private static void WebServiceOne()
{
CallOne();
CallThree();
}
private static void WebServiceTwo()
{
CallTwo();
CallFour();
}
所以我需要调用对子调用具有以下序列: -
CallOne();
CallTwo();
CallThree();
CallFour();
答案 0 :(得分:5)
根据您用于实施webserviceone
webservicetwo
的内容,Web服务工具本身很可能具有完全异步支持,因此首先要做的是:检查,并使用异步API而不是同步API。
如果由于某种原因,这不存在 - 你可以做类似的事情:
var task = new Task(() => webservice1());
task.Start();
webservice2();
task.Wait();
(显然你可以同时运行两个完全异步;我假设在上面你只想并行运行它们,并在最后“加入”)
重新编辑:如果订单必须完全是“一个”,“两个”,“三个”,“四个”,那么你不能并行执行它们,所以你不得不反过来运行整个事情在后台:
new Task(() => {
webservice1();
webservice2();
}).Start();
这将保证执行顺序,牺牲并行性。
答案 1 :(得分:2)
Action one = () => WebServiceOne();
Action two = () => WebServiceTwo();
one.BeginInvoke(null, null);
two.BeginInvoke(null, null);
答案 2 :(得分:1)
我喜欢使用动作。
private static void WebServiceCalls()
{
var someState = 3;
Action a1 = () => { WebserviceOne(); };
Action a2 = () => { WebserviceTwo(); };
a1.BeginInvoke(WebServiceCallBack, someState); //see code section below
a2.BeginInvoke(null, null); //fire and forget...
}
这也允许您创建一个用于处理代码的回调:
void WebServiceCallBack(IAsyncResult result)
{
int state = (int)result.AsyncState;
//do more??
}
@Mark提出了一个有效的观点:如果您正在使用Visual Studio中的Web服务,则可以使用服务引用配置窗口创建具有异步语法的Channel Proxy类。 (即使用BeginWebServiceOne
和EndWebServiceOne
,这将排除创建异步包装器的需要。)
答案 3 :(得分:0)
在这里查看任务库,以及左侧子类别的导航