具有以下代码:
var conn = new NpgsqlConnection("...");
conn.Open();
conn.Notification += (o, e) =>
{
Console.WriteLine("Received notification begin");
Thread.Sleep(10000);
Console.WriteLine("Received notification end");
};
using (var cmd = new NpgsqlCommand("LISTEN query", conn))
{
cmd.ExecuteNonQuery();
}
while (true)
{
conn.Wait();
}
当我运行它时,来自数据库2的触发器迅速请求输出:
收到的通知开始
收到的通知结束
收到的通知开始
收到的通知结束
这表明只有第一个事件结束后才会触发第二个事件。
在事件处理程序中,我需要运行一些代码,直到下一个事件触发:
var stream = Stream.CreateFilteredStream();
...
stream.StartStreamMatchingAllConditions(); // blocking
当下一个事件触发时,我需要在处理程序中运行相同代码之前调用stream.StopStream()
(以结束上一个流)。
问题在于,由于stream.StartStreamMatchingAllConditions()
被阻止,下一个事件不会触发,因此无法停止上一个流。
有什么办法可以做到这一点?
答案 0 :(得分:0)
如果我正确理解了该请求,则希望能够在完成第一个通知的处理之前处理下一个通知。这意味着您的事件处理程序代码在与从Npgsql分发事件的线程不同的线程中运行-情况并非如此。
不过,通过自己在单独的线程中运行处理代码,您可以轻松地在代码中实现此目标:
conn.Notification += (o, e) =>
{
Task.Run(() =>
{
Console.WriteLine("Received notification begin");
Thread.Sleep(10000);
Console.WriteLine("Received notification end");
});
};