2

我有以下两种方法:

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

4 回答 4

5

根据您使用的实现webserviceone webservicetwo方式,Web 服务工具本身很可能具有完整的异步支持,因此首先要做的是:检查并使用异步 API 而不是同步 API。

如果由于某种原因不存在 - 您可以执行以下操作:

var task = new Task(() => webservice1());
task.Start();
webservice2();
task.Wait();

(显然你可以完全异步运行;我假设在上面你只想并行运行它们,并在最后“加入”)

重新编辑:如果顺序必须恰好是“一”、“二”、“三”、“四”,那么您不能并行执行它们,因此您只能在后台运行整个事情:

new Task(() => {
    webservice1();
    webservice2();
}).Start();

这将保证执行顺序,牺牲并行性。

于 2012-10-19T11:33:22.633 回答
2
Action one = () => WebServiceOne();
Action two = () => WebServiceTwo();
one.BeginInvoke(null, null);
two.BeginInvoke(null, null);
于 2012-10-19T11:33:02.140 回答
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 类。(即使用BeginWebServiceOneandEndWebServiceOne将排除创建异步包装器的需要。)

于 2012-10-19T11:42:30.607 回答
0

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

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

于 2012-10-19T11:34:15.427 回答