我怎样才能异步调用两个方法?

时间:2012-10-19 11:30:16

标签: c# .net web-services asynchronous

我有以下两种方法:

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();

4 个答案:

答案 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类。 (即使用BeginWebServiceOneEndWebServiceOne,这将排除创建异步包装器的需要。)

答案 3 :(得分:0)

在这里查看任务库,以及左侧子类别的导航

http://msdn.microsoft.com/en-us/library/dd537609.aspx