2015-07-21 189 views
-1

我们有一个WCF服务的方法和他们的异步,我们想叫他们异步。
下面的代码挂断: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); 
} 

,但下面的代码是OK和运行没有问题:

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方法调用?

回答

4

调用异步WCF 方法有什么区别和哪个是正确的?

这种差别是,前者死锁这里:

resultOfLoadEmployees.Wait(); 

同步上下文尝试(首次await后的所有内容)当元帅的延续工作回来,但可以因为VIA的封锁不一个Wait()呼叫,同步阻止。后者正确地异步等待结果返回,而不阻止呼叫。这就是为什么you shouldn't block no async code

你应该使用后者。

附注 - 你可以保存自己的状态机代,你可以简单地返回由EmployeeGetListAsync创建的热点任务:

private Task<List<DtoEmployee>> LoadEmployeesAsync(int employeeNumber) 
{ 
    return _serviceClient.EmployeeGetListAsync(employeeNumber); 
} 
+0

的“resultOfLoadEmployees.Result”没有帮助的东西要么。 –

+0

@BigDaddy当然。虽然,“等待”已经先杀死了它。 –