命令超时不抛出

The command timeout does not throw

 private void NpgSqlGetContracts(IList<Contract> con)
    {
        var conn = (NpgsqlConnection)Database.GetDbConnection();

        List<Contract> contracts = new List<Contract>();

        using (var cmd = new NpgsqlCommand("SELECT * FROM \"Contracts\";", conn))
        {
            cmd.CommandTimeout = 1;

            cmd.Prepare();

            int conCount= cmd.ExecuteNonQuery();

            using (var reader = cmd.ExecuteReader(CommandBehavior.SingleResult))
            {
                while (reader.Read())
                {
                    contracts.Add(MapDataReaderRowToContract(reader));
                }
            }
        }
    }

这里我有这段代码可以在 postgres 中尝试命令超时,我已经尝试在 visual studio 中使用断点在本地调试它。我尝试了 ExecuteNonQuery 和 ExecuteReader 查询花费了 超过 1 秒 来加载所有数据(我这里有超过 300 万行)。但是 命令超时设置为 1 秒。我想知道为什么这里没有抛出任何异常,我这里配置错了什么?

谢谢:)

正如@hans-kesting 上面所写,命令超时不是整个命令的累积,而是每个单独的 I/O-producing 调用(例如 Read)。从这个意义上说,它旨在帮助解决查询 运行 时间过长(没有产生任何结果)或网络问题。

你可能还想看看 PostgreSQL 的 statement_timeout,它是整个命令的 PG 端超时。它也有它的问题,Npgsql 永远不会为您隐式设置它 - 但您可以自己设置它。