【问题标题】:Calling an async web service repeatedly but never concurrently using C#重复调用异步 Web 服务,但从不使用 C# 并发
【发布时间】:2014-11-17 17:40:47
【问题描述】:

我需要使用其 API 提供的异步方法从控制台应用程序中调用第 3 方 Web 服务。我正在使用旧的 ASMX Web 参考方式来生成代理。

我有一个执行以下操作的类,我想创建它的一个实例,用它调用服务,但是我想等待回调完成,然后才用新的重复实例、新调用、新回调等

我不想一次激活超过 1 个通话。 即一次只存在一个类的实例。

Web 服务调用代码如下所示:

using(ABCWebService service = new ABCWebService())
{
    ...
    service.ExecuteCallAndWaitResultCompleted += service_ExecuteCallAndWaitResultCompleted;
    service.ExecuteCallAndWaitResultAsync(parm1, parm2, .., stateObj);
}

...

回调如下所示:

void service_ExecuteCallAndWaitResultCompleted(object sender, ExecuteCallAndWaitResultCompletedEventArgs e)
{
    // collect data and then move onto next sequential call
}

【问题讨论】:

  • AsyncMethod 的返回类型是什么?您也许可以使用 TaskFactory.FromAsync 方法之一来使用 async/await 模式。
  • 如果你想阻止,为什么还要异步调用它?
  • @StephenKennedy 他不想阻止,他只是不想并发呼叫。
  • @CoryNelson 我认为他想阻止。它是一个控制台应用程序,它调用 Web 服务,等待响应,一旦响应到达就执行某些操作,然后无限期地重新开始。因此,去老学校并调用非异步客户端代码。如果我误读了情况,请提前道歉。
  • 似乎是不必要的异步 IO 情况。您似乎假设服务器提供异步 API,而实际上服务器和客户端是独立的。您可以将同步和异步与 any 服务器一起使用。见stackoverflow.com/a/22591516/122718

标签: c# .net web-services asynchronous


【解决方案1】:

我非常怀疑是否存在“[the] API 提供的异步方法”。网络方法是一种网络方法。这是您的异步​​调用,也就是说,通过在客户端代理类上调用异步函数,您告诉框架(基本而言)在另一个线程上触发对该资源的请求,并在它有结果时回调您.它是您的异步​​客户端调用。

在 Visual Studio (2012) 中,当您添加服务引用,然后单击高级,然后单击添加 Web 引用以创建基于 VS 所谓的“基于 .NET Framework 2.0 Web 服务技术的代码”的服务引用,我收集是您如何完成的,生成的客户端类不仅具有每个 Web 方法的异步方法,而且还具有同步方法 - 一个用于服务中的每个 Web 方法。这些同步方法在得到结果之前不会返回任何内容或将控制权返回给调用者。

如果我的用例正确,您希望控制台应用程序调用 Web 方法,等待响应,在响应到达后执行某些操作,然后重新开始。在这种情况下,不要调用异步方法(例如GetPeopleAsync调用同步方法GetPeople)- 可能在循环中。

【讨论】:

  • 今天早上我尝试运行同步方法时有点复杂。对服务的调用会生成一个 Excel 报告。同步方法会立即返回,但生成报告可能需要一些时间。使用异步方法,我可以保证报告的存在以对其进行 IO 处理并防止并发执行。如何在等待回调完成时阻塞线程?
  • 按照stackoverflow.com/questions/3909063/…结束了使用ManualResetEvent
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多