WCF异步方法调用挂起?

时间:2015-07-21 13:18:25

标签: c# asynchronous async-await

我们有一个带有方法及其异步的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方法有什么区别,哪一个是正确的?

1 个答案:

答案 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);
}