[英]WCF async method calling hangs up?
我們有一個帶有方法及其異步的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方法是正確的嗎?
區別在於前者在這里陷入僵局 :
resultOfLoadEmployees.Wait();
同步上下文試圖將繼續工作封送回去(在您第一次await
后的所有操作),但不能這樣做,因為它被通過同步阻塞的Wait()
調用阻塞了。 后者適當地異步等待結果返回,而不阻塞調用。 這就是為什么您不應該阻止任何異步代碼的原因
您應該使用后者。
旁注-您可以節省狀態機的生成,因為您只需返回EmployeeGetListAsync
創建的熱任務即可:
private Task<List<DtoEmployee>> LoadEmployeesAsync(int employeeNumber)
{
return _serviceClient.EmployeeGetListAsync(employeeNumber);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.