我有以下两种方法:
private static void webservicecalls()
{
WebServiceOne();
WebServiceTwo();
}
那么,我如何使这两种方法不同步,而不是在调用第二个Web服务之前等待第一个Web服务呼叫?
更新:
现在Webericeone和WebServicetwo都有sub呼叫,例如:
private static void WebServiceOne()
{
CallOne();
CallThree();
}
private static void WebServiceTwo()
{
CallTwo();
CallFour();
}
所以我需要呼叫才能为子呼叫的以下顺序: -
CallOne();
CallTwo();
CallThree();
CallFour();
取决于您用来实现 webserviceone
webservicetwo
的用途,网络服务工具本身很可能会具有完整的异步支持,因此首先要做的是:检查并使用异步API而不是同步API。
如果出于某种原因不存在 - 您可以做类似:
的事情var task = new Task(() => webservice1());
task.Start();
webservice2();
task.Wait();
(显然,您可以完全顺序运行;
您的编辑:如果订单必须完全是"一个","两个","三","四",那么您就不能并行执行它们,因此您只需要运行整个内容在背景中:
new Task(() => {
webservice1();
webservice2();
}).Start();
将保证执行顺序,牺牲并行性。
Action one = () => WebServiceOne();
Action two = () => WebServiceTwo();
one.BeginInvoke(null, null);
two.BeginInvoke(null, null);
我喜欢使用动作。
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代理类。(即使用BeginWebServiceOne
和EndWebServiceOne
,这将排除创建异步包装器的需求。)
在此处查看任务库,以及左侧的子类别的导航
http://msdn.microsoft.com/en-us/library/dd537609.aspx