等待多个异步调用完成?

Bre*_*Dev 2 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();
}
Run Code Online (Sandbox Code Playgroud)

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

我已经尝试过这样做,使用这个调用,但它仍然没有等待所有的调用完成后再继续下一段代码:

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

任何建议都会非常感激,因为我在这一点上做了什么.

感谢大家.

Ste*_*ary 8

来自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
}
Run Code Online (Sandbox Code Playgroud)

当你打电话时,你应该只使用await,而不是使用Task.Run或Task.Wait:

await CreateMultipleTasksAsync();
// At this point, the results have been retrieved and processed.
Run Code Online (Sandbox Code Playgroud)