我们有一个带有方法及其异步的WCF服务,我们想把它们称为异步。
以下代码挂起:
private void btnRunTest_Click(object sender, EventArgs e)
{
Task<List<DtoEmployee>> resultOfLoadEmployees = LoadEmployeesAsync(predicateEmployee1); // hangs up on this line
resultOfLoadEmployees.Wait();
var employeeList = resultOfLoadEmployees.Result;
foreach (var item in employeeList)
{
//Do Something
}
}
private async Task<List<DtoEmployee>> LoadEmployeesAsync(int employeeNumber)
{
return await _serviceClient.EmployeeGetListAsync(employeeNumber);
}
但是以下代码没问题并且运行没有问题:
private async Task<List<DtoEmployee>> LoadEmployeesAsync(int employeeNumber)
{
return await _serviceClient.EmployeeGetListAsync(employeeNumber);
}
private async void btnRunTest_Click(object sender, EventArgs e)
{
List<DtoEmployee> employeeList = await LoadEmployeesAsync(employeeNumber);
foreach (var item in employeeList)
{
//Do Something
}
}
调用异步WCF方法有什么区别,哪一个是正确的?
答案 0 :(得分:4)
调用异步WCF的区别是什么,哪一个是正确的 方法
区别在于前者死锁:
resultOfLoadEmployees.Wait();
同步上下文正在尝试封送延续工作(第一个await
之后的所有内容),但无法通过Wait()
调用阻止它同步阻止。后者正确地异步等待结果返回,同时不阻止调用。这就是you shouldn't block no async code
你应该使用后者。
附注 - 您可以自行保存状态机生成,因为您只需返回由EmployeeGetListAsync
创建的热门任务:
private Task<List<DtoEmployee>> LoadEmployeesAsync(int employeeNumber)
{
return _serviceClient.EmployeeGetListAsync(employeeNumber);
}