如何在 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&lt;string&gt;应该返回什么? @Philippe Paré 抱歉对代码进行了更改,我没有任何返回类型,它是无效的。 然后直接返回Task :) 如果 Web API 方法/操作不涉及任何异步工作(例如 IO),则您不应该真正使其异步 是的@YacoubMassad 是对的,但是如果你需要它发生在另一个线程上(如果你不希望代码在那里阻塞),你可以调用Task.Run(()=&gt;//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 操作异步执行?

C#异步方法async/await的三种返回类型

使用 Hystrix 异步执行 void 方法

Web API 方法的返回类型格式器过滤器

Web API 服务 - 如何在异步任务中使用“HttpContext.Current”

C#.NET Web API 2,如何使用 HTTPGET 异步方法上的 HttpContent 从网站中提取特定文本?