gpt4 book ai didi

c# - 在 WebApi 方法中调用异步方法

转载 作者:行者123 更新时间:2023-11-30 19:57:31 24 4
gpt4 key购买 nike

我有两种方法,一种在 WebApi (Post()) 中,一种在我的数据存储库 (Save()) 中。在 Save 方法中,我使用 await 调用异步方法。 Save 方法本身是异步的。

我最终想完成的是在Save方法中的函数完成后向用户发送201。

网络接口(interface):

public HttpResponseMessage Post(JObject input)
{
Event postedEvent = new Event(// here be data //);
IEventRepo repo = new MongoDBRepo();

return repo.Save(postedEvent).Result;
}

数据 repo :

public async Task<HttpResponseMessage> Save(Event e)
{
await _collection.InsertOneAsync(e);

return new HttpResponseMessage(HttpStatusCode.Created);
}

现在发生的是保存将完成,但永远不会发送 HttpResponseMessage。所以对服务器的请求会挂掉。

最佳答案

您遇到死锁是因为您阻塞了 repo.Save 返回的 Task 结果,而不是等待它。

您需要一直使用 async 直到您的 Controller 操作:

public async Task<HttpResponseMessage> Post(JObject input)
{
Event postedEvent = new Event(/* here be data */);
IEventRepo repo = new MongoDBRepo();

return await repo.Save(postedEvent);
}

看到这个优秀blog post有关此死锁原因的更详细解释,但 - 本质上 - 这是由于 repo 中异步调用的继续正在等待已被您调用的方法阻塞的请求上下文引起的 repo 来自(依次等待继续完成等等...)。

关于c# - 在 WebApi 方法中调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29717175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com