WCF 异步方法调用挂起
本文关键字:挂起 调用 异步方法 WCF | 更新日期: 2023-09-27 18:04:00
我们有一个带有方法及其异步的 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 方法是正确的?
有什么区别,哪一个是正确的调用异步 WCF 方法?
区别在于,前者在这里陷入僵局:
resultOfLoadEmployees.Wait();
同步上下文正在尝试封送延续工作(第一次await
之后的所有内容(,但不能,因为它通过同步阻塞的Wait()
调用被阻止。后者正确地异步等待结果返回,同时不阻止调用。这就是为什么你不应该阻止没有异步代码
您应该使用后者。
旁注 - 您可以节省状态机生成,因为您可以简单地返回 EmployeeGetListAsync
创建的热任务:
private Task<List<DtoEmployee>> LoadEmployeesAsync(int employeeNumber)
{
return _serviceClient.EmployeeGetListAsync(employeeNumber);
}