【发布时间】:2019-09-03 10:21:33
【问题描述】:
请帮助我理解为什么这段代码会导致死锁? 我有一个 asp.net web api 应用程序,我试图使一些控制器方法异步。
[HttpPost]
[Authentication]
public async Task<SomeDTO> PostSomething([FromBody] SomeDTO someDTO)
{
return await _service.DoSomething(someDTO);
}
这是被调用的服务方法的外观:
public async Task<SomeDTO> DoSomething(SomeDTO someDTO)
{
...
var someTask = Task.Run(() =>
{
var entity = new SomeEntity(someDTO);
return _repository.Create(entity);
});
...
var result = await someTask;
...
}
还有一些全局处理程序,可以将响应打印到控制台。
public class AppGlobalHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var resp = base.SendAsync(request, cancellationToken);
Debug.WriteLine($"Response:{request.RequestUri}{Environment.NewLine}{resp?.ConfigureAwait(false).GetAwaiter().GetResult()?.Content?.ReadAsStringAsync().ConfigureAwait(false).GetAwaiter().GetResult()}");
return resp;
}
}
看起来像 ConfigureAwait(false).GetAwaiter().GetResult() 阻塞调用者线程,但我认为 ConfigureAwait(false) 应该避免这种情况,不是吗?
【问题讨论】:
-
为什么将代码包装在 Task.Run() 中?强制同步代码异步运行是没有意义的,它只会使用更多线程。如果你不能一直异步,坚持同步。
-
这是代码的一部分,我需要并行运行一些操作@MarcusHöglund
-
我没有看到任何东西会在您的代码中并行运行。记住:异步!= 并行
-
“这是代码的一部分”的意思是:我们发现死锁的机会很小。
-
otoh,没有那个(和类似的)
Debug.WriteLine()行会死机吗?
标签: c# asp.net .net async-await deadlock