我必须从 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.Run
或 Task.Wait
:
await CreateMultipleTasksAsync();
// At this point, the results have been retrieved and processed.
关于c# - 等待多个异步调用完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33149809/