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 异步方法调用挂起

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

区别在于,前者在这里陷入僵局:

resultOfLoadEmployees.Wait();

同步上下文正在尝试封送延续工作(第一次await之后的所有内容(,但不能,因为它通过同步阻塞的Wait()调用被阻止。后者正确地异步等待结果返回,同时不阻止调用。这就是为什么你不应该阻止没有异步代码

您应该使用后者。

旁注 - 您可以节省状态机生成,因为您可以简单地返回 EmployeeGetListAsync 创建的热任务:

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