2017-08-31 142 views
2

我不知道這個代碼有什麼問題,但它仍然沒有響應所需的值。卡住異步任務和等待

這是我的示例代碼:

的WebAPI 2:

KOTController.cs

[HttpGet] 
[Route("testasync")] 
public IHttpActionResult TestAsync() 
{ 
    try 
    { 
     return Ok(_iKOTManager.TestAsync()); 
    } 
    catch (Exception ex) 
    { 
     logger.Error(ex); 
     return null; 
    } 
} 

接口

IKOTManager.cs

Task<int> TestAsync(); 

KOTManager.cs

public async Task<int> TestAsync() 
{ 
    return await Task.Run<int>(() => 
    { 
     return 999 + 23; 
    }); 
} 

當我把這個API的請求時,它會返回這樣的事情不是數字

<TaskOfint xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/System.Threading.Tasks"/>

任何建議將非常有幫助。謝謝。

+3

重構返回任務的動作然後等待接口上的方法 – Nkosi

回答

4

你得到的迴應是因爲你返回任務而沒有實際執行它。該框架只是序列化任務對象並返回。

重構的動作,以在界面返回Task然後await方法

[HttpGet] 
[Route("testasync")] 
public async Task<IHttpActionResult> TestAsync() { 
    try { 
     return Ok(await _iKOTManager.TestAsync()); 
    } catch (Exception ex) { 
     logger.Error(ex); 
     return InternalServerError(); 
    } 
} 

參考:Async/Await - Best Practices in Asynchronous Programming

此外,在例外的情況下,你應該返回,而不是null相應的結果。這應該最終被重構,因爲處理控制器內的錯誤被認爲是cross-cutting concern。控制者應該儘可能的精益。

[HttpGet] 
[Route("testasync")] 
public async Task<IHttpActionResult> TestAsync() { 
    return Ok(await _iKOTManager.TestAsync()); 
} 
3

您需要將您的控制器更改爲async然後await該任務。即

public async Task<IHttpActionResult> TestAsync() 

...

return Ok(await _iKOTManager.TestAsync()); 

async/awaithere的文檔。

0

你的操作方法,在消費/調用異步方法,你需要讓你的操作方法,以及異步返回Task<T>的返回類型,如:

[HttpGet] 
[Route("testasync")] 
public async Task<IHttpActionResult> TestAsync() 
{ 
    try 
    { 
     return Ok(await _iKOTManager.TestAsync()); 
    } 
    catch (Exception ex) 
    { 
     logger.Error(ex); 
     return null; 
    } 
} 

如果我們呼籲一個異步方法,如果可能的話,我們應該調用方法以及異步並在所有調用鏈中返回Task<T>

希望它有幫助!