【发布时间】:2019-10-01 15:15:46
【问题描述】:
我们有一个 Web 应用程序,它由我们的 UI 使用的 Web API 组成。 Web 应用程序安装在不同的服务器上(在我们的客户端安装之前进行测试)。
在一台服务器上,我们通过以下端点获得了死锁:
[HttpGet, Route(Order = 1)]
public IHttpActionResult GetUserDetails(long userKey)
{
var userService = ResolveService<IUserService>();
var nameService = ResolveService<INameService >();
LoggInfo("Start userService.Get()"); //logged in logs
var result = userService.Get(userKey);
this.LoggInfo($"End userService.Get() with id = "{result.Id}); // logged in logs
try
{
LoggInfo($"Start nameService.Get()"); // logged in logs
result.Name = nameService.Get(result.Namekey).Result?.Name;
LoggInfo($"End nameService.Get()"); // not logged in logs
}
catch(Exception ex)
{
LogError("An error occured in NameService"); // not logged in logs
}
return Ok(result);
}
nameService.Get(id) 是一个async 方法:
public async Task<NameDTO> GetAsync(long key)
{
LogInfo("start NameService.Get()"); // not logged in logs
var query = GetQuery();
var name = await query.Select(MapName())
.FirstOrDefaultAsync(n => n.Key == key);
return name;
}
当我删除异步签名时,一切都按预期工作,根据this article,出现死锁是正常的。
你能解释一下为什么这在其他服务器上有效吗?
提前感谢您的帮助
【问题讨论】:
-
为什么不让
GetUserDetails异步,然后在异步调用中使用正确的等待语法? -
这个
query.Select(MapName()).FirstOrDefaultAsync(n => n.Key == key)是不是在有死锁的服务器上同步完成,而在其他服务器上同步完成? -
@Mason,我知道上面的方法不好,我只是想了解为什么有时有效,有时无效。
-
@PetSerAi,是的,这就是问题所在,请注意查询不需要很多时间(当我在 sql developer 中运行生成的查询时)
标签: c# asynchronous asp.net-web-api