C# 同步调用异步方法调用任务。结果导致代码死锁

C# 同步调用异步方法调用任务。结果导致代码死锁,c#,async-await,deadlock,C#,Async Await,Deadlock,我试图从同步库方法调用异步方法,并遇到问题。我将从显示一些代码开始 public void执行(RegisterUserCommand) { var user=new UserAccountEntity { 用户名=command.EmailAddress, Email=command.EmailAddress, }; var task=_userManager.CreateAsync(用户、命令、密码); var result=task.result;//导致死锁 如果(!result.suc

我试图从同步库方法调用异步方法,并遇到问题。我将从显示一些代码开始

public void执行(RegisterUserCommand)
{
var user=new UserAccountEntity
{
用户名=command.EmailAddress,
Email=command.EmailAddress,
};
var task=_userManager.CreateAsync(用户、命令、密码);
var result=task.result;//导致死锁
如果(!result.successed)
抛出新的commandInvalideException(“命令失败”,result.Errors);
}
调用task.Result会使代码死锁

在做了一些研究(包括阅读)和挖掘之后,我现在认为我对造成僵局的原因有了相对较好的理解

我正在使用asp.net Identity中的UserManager。我使用dotPeek并发现UserManager.CreateAAsync调用UserValidator.ValidateAsync,它将在不调用.ConfigureAwait(false)的情况下等待某些任务

  • 我认为这会导致task.Result死锁,对吗?当我无法控制正在调用的异步方法时,如何解决此死锁
  • 是否可以对从未实现ConfigureWait的库方法返回的任务调用.Result(false)

  • 答案是“在线程池线程中显式执行异步方法,并等待它完成”。今天晚些时候我将对此进行测试,但这是否意味着如果不手动启动新线程,就无法解决问题
  • 我认为解决这个问题的最好办法是使我的Execute方法异步,这个假设正确吗?不过,我宁愿等待这个解决方案,并尝试在不首先使用异步的情况下修复它

你就不能自己调用
任务上的
ConfigureAsync(false)
吗?我试过了,似乎不起作用。不知道为什么。我编辑了这个问题。我更清楚地说明了我在寻找什么信息。我认为它不再是重复的,在我的情况下,我无法控制正在调用的异步方法。你不应该使这个方法同步。它应该是异步的。或者,您应该调用完全同步的方法来完成这项工作,而不是尝试使用半对半。“如果我不手动启动一个新线程,就无法解决我的问题吗?”是的,这是正确的。异步延续需要能够在I/O事件返回后使用线程。如果它与主线程关联,则当主线程在
task.Result上被阻塞时,无法运行延续。无法确定任务要在哪个线程上运行,通常可以使用
.ConfigureAwait(false)
覆盖该线程,但这取决于它的编写方式。