【问题标题】:WCF async method calling hangs up?WCF 异步方法调用挂断?
【发布时间】:2015-07-21 21:38:07
【问题描述】:

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

【问题讨论】:

    标签: c# asynchronous async-await


    【解决方案1】:

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

    区别在于前者的死锁在这里:

    resultOfLoadEmployees.Wait();
    

    同步上下文正在尝试将继续工作编组回来(在您的第一个 await 之后的所有内容),但不能因为它被同步阻塞的 Wait() 调用阻塞。后者正确地异步等待结果返回,而不阻塞调用。这就是为什么you shouldn't block no async code

    你应该使用后者。

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

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

    【讨论】:

    • “resultOfLoadEmployees.Result”也无济于事。
    • @BigDaddy 绝对是。虽然,Wait 已经先杀了它。
    猜你喜欢
    • 1970-01-01
    • 2011-09-24
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多