如何在 Web API 的异步方法中返回 void
Posted
技术标签:
【中文标题】如何在 Web API 的异步方法中返回 void【英文标题】:How Return Void in Async Method in Web API 【发布时间】:2016-08-30 14:25:38 【问题描述】:我正在从存储库调用 Web API(C#) 中的方法。该方法是存储库不返回任何内容。是虚空。为什么我应该在我的 API 方法中返回,因为异步方法不能有 Void 返回类型。
这是我在 API 中的异步方法:
[HttpPost]
[Route("AddApp")]
public async Task<?> AddApp([FromBody]Application app)
loansRepository.InsertApplication(app);
这是在存储库中插入的 EntityFrame 工作(我可以顺便更改一下)
public void InsertApplication(Application app)
this.loansContext.Application.Add(app);
对不起,我对问题进行了更改,我不确定我应该做什么?在任务中
【问题讨论】:
你的Task<string>
应该返回什么?
@Philippe Paré 抱歉对代码进行了更改,我没有任何返回类型,它是无效的。
然后直接返回Task
:)
如果 Web API 方法/操作不涉及任何异步工作(例如 IO),则您不应该真正使其异步
是的@YacoubMassad 是对的,但是如果你需要它发生在另一个线程上(如果你不希望代码在那里阻塞),你可以调用Task.Run(()=>//Your cp-bound work here, happening on another thread));
【参考方案1】:
编译器将警告“缺少返回语句”。请将代码修改为:
[HttpPost]
[Route("AddApp")]
public void AddApp([FromBody]Application app)
//add configureAwait(false) as it would give better performance.
loansRepository.InsertApplication(app)
【讨论】:
这不是对他问题的回答,而是评论。请不要为此使用答案部分。 您对 ConfigureAwait 的评论完全不成立。请详细了解它的实际作用以及使用它的原因。async/await
的使用无缘无故地增加了额外的不必要的开销。考虑直接返回Task.Run
结果。
我对 ConfigureAwait 的评论非常有效。请在这里阅读link。我也有来自微软的第一手资料。
Stephen Cleary 是最好的方法,因为存储库调用是同步的。但是,问题是关于如何从异步方法返回 void,我必须将它包装在 Task.Run 中。 Task.Run 不是 asp.net 应用程序中推荐的方法,因为您使用的是线程池中的线程。【参考方案2】:
由于您“无法”更改 Entity Framework 存储库,因此您不应该使您的操作方法异步,您应该只返回 void
:
[HttpPost]
[Route("AddApp")]
public void AddApp([FromBody]Application app)
loansRepository.InsertApplication(app);
【讨论】:
斯蒂芬是所有异步事物的权威 - 我会接受他的回答。 您将如何从 C# 客户端调用此方法? @FaithWins:您将使用序列化的Application
作为请求正文发布到/AddApp
。如果您想了解更多信息,我建议您提出自己的问题。
谢谢@StephenCleary。【参考方案3】:
如果您不想返回任何内容,则返回类型应为Task
。
[HttpPost]
[Route("AddApp")]
public async Task AddApp([FromBody]Application app)
// When you mark a method with "async" keyword then:
// - you should use the "await" keyword as well; otherwise, compiler warning occurs
// - the real return type will be:
// -- "void" in case of "Task"
// -- "T" in case of "Task<T>"
await loansRepository.InsertApplication(app);
public Task InsertApplication(Application app)
this.loansContext.Application.Add(app);
// Without "async" keyword you should return a Task instance.
// You can use this below if no Task is created inside this method.
return Task.FromResult(0);
【讨论】:
以上是关于如何在 Web API 的异步方法中返回 void的主要内容,如果未能解决你的问题,请参考以下文章
如何使 ASP.NET Core Web API 操作异步执行?
Web API 服务 - 如何在异步任务中使用“HttpContext.Current”
C#.NET Web API 2,如何使用 HTTPGET 异步方法上的 HttpContent 从网站中提取特定文本?