簡體   English   中英

WCF異步方法調用掛斷了嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM