【问题标题】:Stuck with Async Task and Await卡住异步任务并等待
【发布时间】:2017-08-31 12:13:44
【问题描述】:

我不知道这段代码有什么问题,但它仍然没有响应所需的值。

这是我的示例代码:

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 发送请求时,它返回的不是数字,而是类似这样的内容

&lt;TaskOfint xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/System.Threading.Tasks"/&gt;

任何建议都会很有帮助。谢谢。

【问题讨论】:

  • 重构动作以返回任务,然后在界面上等待方法

标签: c# async-await asp.net-web-api2


【解决方案1】:

您收到该响应是因为您返回了 Task 而没有实际执行它。框架只是序列化任务对象并返回它。

重构动作以返回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());
}

【讨论】:

    【解决方案2】:

    您需要将您的控制器更改为async,然后将任务更改为await。即

    public async Task<IHttpActionResult> TestAsync()
    

    ...

    return Ok(await _iKOTManager.TestAsync());
    

    请参阅async/awaithere 的文档。

    【讨论】:

      【解决方案3】:

      您的操作方法正在使用/调用 async 方法,您需要使您的操作方法以及异步返回 Task&lt;T&gt; 作为返回类型:

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

      如果我们正在调用异步方法,如果可能的话,我们应该使调用方方法也异步并在所有调用链中返回Task&lt;T&gt;。

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 1970-01-01
        • 2014-09-06
        • 2013-02-10
        • 2017-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多