有没有办法阻止 NpgsqlConnection 处于等待状态,同时确保等待时不会丢失任何通知?

问题描述 投票:0回答:1

在 PostgreSql 中,我编写了通用代码来通知表更新。

这样做,我必须等待连接。没有等待,我没有收到数据库的通知。所以我就这样等待:

conn.Wait(Timeout.Infinite);

我本来可以在循环中使用不带任何参数的 Wait,因为我害怕因并发而错过一些通知。例如,当两个通知同时进入时,当不带参数调用 wait 并通过接收第一个通知而释放时,我们可能会错过第二个通知(在等待状态返回之前)。所以我使用了“Timeout.Infinite”。

为了停止来自另一个线程的连接,我尝试用以下方法关闭它:

conn.Close()

但我收到一个异常:

Npgsql.NpgsqlOperationInProgressException: 'The connection is already in state 'Waiting''

所以问题是:

有没有办法让连接不再处于等待状态,同时保证等待时不丢失任何通知?

注意:我认为(仅是我的意见)PostgreSql“Connection.Wait”函数中缺少 CancellationToken。我们应该可以在等待下一次更改时取消等待。

c# postgresql notifications database-connection npgsqlconnection
1个回答
0
投票

使用

WaitAsync
函数,该函数接受
CancellationToken

await conn.WaitAsync(someToken);

显然,这必须在

async
函数中完成,永远不应该使用
.Wait
.Result
来调用该函数,否则可能会发生死锁。相反,请执行一直异步

© www.soinside.com 2019 - 2024. All rights reserved.