gpt4 book ai didi

c# - 我应该如何使用不允许异步 Controller 操作的 CMS 处理异步 API 调用?

转载 作者:行者123 更新时间:2023-11-30 20:35:39 26 4
gpt4 key购买 nike

我一直在尝试使用 async/await,我阅读的大部分内容都声明“不要在异步代码上阻塞”,但控制台应用程序中的 main 函数除外.我发现自己无法遵循这个简单的规则:(

我的应用程序严重依赖于 WebAPI 层。我在 MVC 应用程序中使用的客户端使用 System.Net.Http.HttpClient 上的异步方法来调用 API 方法。目前我有两种处理方式。在某些地方,我们在调用客户端后立即得到结果:

//WebAPI Client
public object GetSomething(int id)
{
var task = _client_GetSomethingFromApiAsync(id);
var result = task.Result;
return result;
}

在其他情况下一直使用异步直到 Controller 。我正在使用 SiteFinity 并且不能使用异步 Controller 操作,所以我最终得到这样的结果:

//WebAPI Client
public Task<object> GetSomethingAsync(int id)
{
return _client_GetSomethingFromApiAsync(id);
}

//Domain Service
public Task<object> GetSomethingDomainServiceAsync(int id)
{
return _service.GetSomethingAsync(id);
}

//Controller
public JsonResult GetSomethingControllerAction(int id)
{
var result = _domainService.GetSomethingDomainServiceAsync(viewModel.id).Result;
return Json(new { Success = true, Payload = result });
}

根据我的研究,这两种解决方案都不是理想的,尽管我没有遇到任何死锁问题并且一切似乎都有效。有人可以帮助我理解我应该遵循的最佳模式并解释原因吗?

谢谢!

最佳答案

I am using SiteFinity and cannot use async controller actions

According to SiteFinity ,它确实支持异步 Controller 操作,只是不支持小部件中的异步操作。如果这是你的情况,我鼓励你vote .

假设您处于这种情况 - 并且不能使用 async 代码 - 那么我建议您一直使用 synchronous 代码。也就是说,将 HttpClient 替换为 WebClient 或类似的东西。我不建议使用 Result,因为即使您的代码今天没有死锁,将来对 HttpClient 的更新也有可能(不太可能,但有可能)导致死锁。

如果您不想失去已经在 async 方面所做的投资,那么我建议您使用我在 brownfield async 上的文章中描述的“ bool 参数 hack” .

关于c# - 我应该如何使用不允许异步 Controller 操作的 CMS 处理异步 API 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37657257/

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