c# - 使用 Result 时出现死锁

标签 c# .net asynchronous async-await

我读到过,当我完全确定操作已完成时,我应该只使用 Result 而不是 await 。我不太确定下面发生了什么,想问问有经验的程序员,这是否是 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);
    }
}

最佳答案

这不安全。使用 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);
    }
}

关于c# - 使用 Result 时出现死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31213842/

相关文章:

c# - Lync API - CaptureVideoWindow 和 RenderVideoWindow 为空

c# - 将模板内容转换为颜色叠加

c# - 从列 = 任何值的表中选择

javascript - 在 JavaScript 上请求客户端证书

.net - .NET 4.0 中的 Array.Sort() 发生了什么? TrySZSort() 消失了吗?

.net - WPF - MVVM - 文本框与 View 模型属性不同步

c# - 什么是 C# 中的方法组?

javascript - "throw new Error()"在 catch block 上下文中捕获

java - 等待一组异步Java调用的轻量级方式

html - 在网页上以非阻塞方式调用URL