我已经开始使用 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 .
假设您处于这种情况 - 并且无法使用异步
代码 - 那么我建议您始终使用同步代码。也就是说,将 HttpClient
替换为 WebClient
或类似的内容。我不建议使用 Result
,因为即使您的代码今天没有死锁,将来对 HttpClient
的更新也有可能(不太可能,但有可能)导致死锁。
如果您不想失去在async
中已经进行的投资,那么我建议使用“ bool 参数黑客”,如我的文章 brownfield async 中所述。 .
关于c# - 我应该如何使用不允许异步 Controller 操作的 CMS 处理异步 API 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37657257/