等待多个异步调用完成
本文关键字:调用 异步 等待 | 更新日期: 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.Run
或Task.Wait
:
await CreateMultipleTasksAsync();
// At this point, the results have been retrieved and processed.