阻塞事件处理程序

时间:2019-03-04 17:36:17

标签: c# npgsql

具有以下代码:

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()被阻止,下一个事件不会触发,因此无法停止上一个流。

有什么办法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了该请求,则希望能够在完成第一个通知的处理之前处理下一个通知。这意味着您的事件处理程序代码在与从Npgsql分发事件的线程不同的线程中运行-情况并非如此。

不过,通过自己在单独的线程中运行处理代码,您可以轻松地在代码中实现此目标:

conn.Notification += (o, e) =>
{
    Task.Run(() =>
    {
        Console.WriteLine("Received notification begin");
        Thread.Sleep(10000);
        Console.WriteLine("Received notification end");
    });
};