卡住异步任务和等待

问题描述:

我不知道这个代码有什么问题,但它仍然没有响应所需的值。卡住异步任务和等待

这是我的示例代码:

的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

你得到的回应是因为你返回任务而没有实际执行它。该框架只是序列化任务对象并返回。

重构的动作,以在界面返回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()); 
} 

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

public async Task<IHttpActionResult> TestAsync() 

...

return Ok(await _iKOTManager.TestAsync()); 

async/awaithere的文档。

你的操作方法,在消费/调用异步方法,你需要让你的操作方法,以及异步返回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>

希望它有帮助!