2015-07-21 122 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當然。雖然,「等待」已經先殺死了它。 –