使用 Result 时出现死锁

Pat*_*ski 2 .net c# asynchronous async-await

我读过,我应该只Resultawait我绝对确定操作已完成时使用而不是使用。我不太确定下面会发生什么,想询问经验丰富的程序员这是否是await//Result的完全安全的用法async

public static bool Success()
{
    return 0 < Execute("DELETE FROM Table WHERE Id = 12").Result;
}

public static async Task<int> Execute(string sql)
{
    using (var con = Connection)
    {
        con.Open();
        return await con.ExecuteAsync(sql);
    }
}
Run Code Online (Sandbox Code Playgroud)

i3a*_*non 5

这不安全。当您使用时操作尚未完成Task.Result

当您调用异步方法时,它会同步运行,直到到达等待状态,然后带着表示异步操作的任务返回给调用者。

任务未完成,使用Task.Result将阻塞调用线程。

您应该等待返回的任务,或者使用同步选项。

public static Task<bool> SuccessAsync()
{
    return 0 < await ExecuteAsync("DELETE FROM Table WHERE Id = 12");
}

public static async Task<int> ExecuteAsync(string sql)
{
    using (var con = Connection)
    {
        con.Open();
        return await con.ExecuteAsync(sql);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @JohnathonSullinger 执行 `.Wait()` 与执行 `.Result` 一样糟糕。**在无法等待的情况下,不应在该调用堆栈中的任何位置使用 async/await**。您应该改为执行同步调用。 (3认同)
  • @JohnathonSullinger 肯定会的。 (2认同)