繁体   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