c# - 等待多个异步调用完成?

标签 c# asynchronous async-await

我必须从 WCF 服务调用三种不同的异步方法。我有以下方法,其中包括所有三个调用:

private async Task CreateMultipleTasksAsync()
{
    CrimcaseServiceClient client = new CrimcaseServiceClient(
        new BasicHttpBinding(),
        new EndpointAddress("http://192.168.1.100/FooService/FooService.svc")
        );

    client.GetEventCompleted += OnGotEventResult;
    client.GetEventAsync(eventInfo);

    client.GetLocationsCompleted += OnGotLocationsResult;
    client.GetLocationsAsync();

    client.GetTypesCompleted += OnGotTypesResult;
    client.GetTypesAsync();
}

完成所有三个调用后,我需要填充一些值。但是,我似乎遇到了如何等待所有三个都先完成的问题。

我已经尝试使用此调用来执行此操作,但在继续下一段代码之前它仍然没有等待所有调用完成:

private void GrabData()
{
    var task = Task.Run(async () => { await CreateMultipleTasksAsync(); });
    task.Wait();
}

任何建议将不胜感激,因为我现在不知道该怎么做。

谢谢大家

最佳答案

from a WCF service

我建议您重建 WCF 客户端代理,并启用异步调用。当前,它正在使用 an older pattern ,但如果您使用现代 Visual Studio 版本重新生成它,它应该会生成 newer pattern。这与 async/await 配合使用效果更好。

然后您实际上可以直接在 WCF 调用中使用 await:

private async Task CreateMultipleTasksAsync()
{
  CrimcaseServiceClient client = new CrimcaseServiceClient(
    new BasicHttpBinding(),
    new EndpointAddress("http://192.168.1.100/FooService/FooService.svc")
    );

  // Start the three asynchronous calls.
  var getEventTask = client.GetEventAsync(eventInfo);
  var getLocationsTask = client.GetLocationsAsync();
  var getTypesTask = client.GetTypesAsync();

  // Asynchronously wait (await) for them all to complete.
  await Task.WhenAll(getEventTask, getLocationsTask, getTypesTask);

  // Retrieve the results of the calls.
  var event = await getEventTask;
  var locations = await getLocationsTask;
  var types = await getTypesTask;

  // TODO: place OnGotEventResult / OnGotLocationsResult / OnGotTypesResult logic here
}

当您调用它时,您应该只使用 await,而不是使用 Task.RunTask.Wait:

await CreateMultipleTasksAsync();
// At this point, the results have been retrieved and processed.

关于c# - 等待多个异步调用完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33149809/

相关文章:

c# - EVENTTARGET 确定发件人时出现问题

c# - 如果在 View 构造函数中填充,ObservableCollection<T> 会触发 SelectionChanged 事件

c# - Selenium WebDriver 第二次点击不起作用

c# - .Net Core App 2.0 与 .Net Standard 2.0 库不兼容

java - 我的异步调用做错了什么?

javascript - 使用 await 检查是否调用了 js 函数?

javascript - 使用静态值创建已解决的 Promise - 为什么执行仍然是异步的

nodeftpd 的 mysql 用户身份验证

c# - 等待数千个任务

javascript - 在 typescript 中输入检查 API 响应