等待多个异步调用完成

本文关键字:调用 异步 等待 | 更新日期: 2023-09-27 18:17:55

我必须从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();
}
如果有任何建议,我将不胜感激,因为我现在不知道该怎么办。

谢谢大家。

等待多个异步调用完成

WCF服务中的

我建议您重新构建WCF客户机代理,启用异步调用。目前,它使用的是一个较旧的模式,但如果你用一个现代的Visual Studio版本重新生成它,它应该会产生一个新的模式,可以更好地与async/await一起工作。

然后你可以直接使用await与你的WCF调用:

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.