簡體   English   中英

陷入異步任務和等待

[英]Stuck with Async Task and Await

我不知道這段代碼有什么問題,但它仍然沒有響應所需的值。

這是我的示例代碼:

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"/>

任何建議都會非常有用。 謝謝。

您得到該響應是因為您返回任務而不是實際執行它。 框架只是序列化任務對象並返回它。

重構動作以返回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 - 異步編程的最佳實踐

此外,在異常的情況下,您應該返回適​​當的結果而不是null 這應該最終被重構,因為控制器內的處理錯誤被認為是一個跨領域的問題 控制器應盡可能精益。

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

您需要將控制器更改為async ,然后await任務。

public async Task<IHttpActionResult> TestAsync()

...

return Ok(await _iKOTManager.TestAsync());

請參閱此處的 async / await文檔。

你的動作方法是消耗/調用異步方法,你需要使你的動作方法和同步返回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>

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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