同步调用异步方法 - 调用task.Result使我的代码死锁

时间:2014-07-30 21:39:18

标签: c# async-await deadlock

我试图从同步库方法调用异步方法并运行到问题。我将首先展示一些代码。

public void Execute(RegisterUserCommand command)
{
    var user = new UserAccountEntity
    {
        UserName = command.EmailAddress,
        Email = command.EmailAddress,
    };

    var task = _userManager.CreateAsync(user, command.Password);

    var result = task.Result; // Causes deadlock

    if (!result.Succeeded)
        throw new CommandInvalidException("Command failed", result.Errors);
}

调用task.Result使我的代码陷入僵局。

在做了一些研究(包括阅读this)和一些挖掘后,我现在认为我对导致死锁的原因有了比较了解。

我正在使用asp .net Identity中的UserManager。我使用了dotPeek,发现UserManager.CreateAsync调用UserValidator.ValidateAsync,它将等待一些任务而不调用.ConfigureAwait(false)。

  • 我是否正确,这会导致task.Result死锁?当我无法控制被调用的异步方法时,如何解决这个死锁?
  • 是否可以从未实现ConfigureAwait(false)的库方法返回的任务上调用.Result?
  • 答案here说明"在线程池线程中显式执行异步方法并等待它完成"。我将在今天晚些时候对此进行测试,但这是否意味着如果没有我手动启动新线程,就无法解决我的问题?
  • 我认为问题的最佳解决方案是使我的Execute方法异步,这个假设是否正确?我宁愿等待这个解决方案,并尝试在不使用异步的情况下修复它。

0 个答案:

没有答案