【问题标题】:How can i call two methods asynchronously?如何异步调用两个方法?
【发布时间】:2012-10-19 11:30:16
【问题描述】:

我有以下两种方法:

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

【问题讨论】:

  • 应用程序有用户界面吗?如果是这样 - WinForms、WPF、Silverlight、ASP.NET?哪个版本的 .NET?
  • 运营合约是什么样的? (如果这是 WCF 服务调用)
  • 重新编辑:顺序必须完全一/二/三/四吗?或者仅仅是一个必须在三个之前,而两个必须在四个之前?这很重要。
  • 是的,它必须是一、二、三、四……

标签: c# .net web-services asynchronous


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 我试着在你提到的背景下运行整个事情,但它不会按预期的顺序运行..
  • @testtest 第二个版本确实运行预期的序列。它与您的原始代码没有任何不同。如果这不能正常工作,那么您的原始代码已损坏。
【解决方案2】:
Action one = () => WebServiceOne();
Action two = () => WebServiceTwo();
one.BeginInvoke(null, null);
two.BeginInvoke(null, null);

【讨论】:

  • @MarcGravell:确实如此。是凭记忆写的。固定。
【解决方案3】:

我喜欢使用动作。

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,这将排除创建异步包装器的需要。)

【讨论】:

  • 但这不会控制这些方法中的执行顺序,请参阅 mu update.. 最好的问候
  • @testtest 确实,当您谈论异步时,您通常放弃的第一件事就是控制执行顺序
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2016-07-20
    相关资源
    最近更新 更多