C# 如何使用NpgsqlConnection.Notification中的信息进行新查询

C# 如何使用NpgsqlConnection.Notification中的信息进行新查询,c#,wpf,postgresql,npgsql,C#,Wpf,Postgresql,Npgsql,我的应用程序中有存储在Postgres DB表中的“Element”对象。 这些元素通过用户界面中的各种编辑器进行编辑,用户可以同时打开多个编辑器。 因此,当DB中发生更改时,我需要更新编辑器中的数据(对于所有客户端和每个打开的编辑器)。 无论如何,我试图为此建立一个侦听/通知机制。像这样: public class Element { public int Id { get; set; } public string Name { get; set; } public

我的应用程序中有存储在Postgres DB表中的“Element”对象。 这些元素通过用户界面中的各种编辑器进行编辑,用户可以同时打开多个编辑器。 因此,当DB中发生更改时,我需要更新编辑器中的数据(对于所有客户端和每个打开的编辑器)。 无论如何,我试图为此建立一个侦听/通知机制。像这样:

public class Element
{
    public int Id { get; set; }
    public string Name { get; set; }

    public void UpdateInDB()
    {
        if (Id > 0)
        {
            using (var cmd = new NpgsqlCommand("UPDATE elements SET name = @v1 WHERE id = @v2", DBOperations.DBConn))
            {
                cmd.Parameters.AddWithValue("v1", Name);
                cmd.Parameters.AddWithValue("v2", Id);
                cmd.ExecuteNonQuery();
            }

            using (var cmdNotify = new NpgsqlCommand("NOTIFY elements_upd , '" + Id.ToString() + "'", DBOperations.DBConn))
            {
                cmdNotify.ExecuteNonQuery();
            }

        }
    }

    public void UpdateFromDB(int id)
    {
        if (id > 0)
        {
            using (var cmd = new NpgsqlCommand("SELECT id, name FROM elements", DBOperations.DBConn))
            using (var reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    Id = (int)reader.GetValue(0);
                    Name = (string)reader.GetValue(1);
                }
            }
        }
    }
}

public class ElementEditor
{
    public Element AssignedElement = null;

    public ElementEditor()
    {
        DBOperations.DBConn.Notification += DBConn_Notification;
        using (var cmd = new NpgsqlCommand("LISTEN elements_upd", DBOperations.resourceDBconn))
        {
            cmd.ExecuteNonQuery();
        }
    }

    private void DBConn_Notification(object sender, NpgsqlNotificationEventArgs e)
    {
        if (AssignedElement!=null)
        {
            if (e.Condition == "elements_upd" && e.AdditionalInformation == AssignedElement.Id.ToString())
            {
                AssignedElement.UpdateFromDB(AssignedElement.Id);
            }
        }
    }
}
问题是,我无法从ElementEditor.DBConn_Notification()调用Element.UpdateFromDB()。我得到一个错误,一个命令已经在执行中:notifyelements_upd,'1'(如果AssignedElement.Id=1)。 我不想发送NOTIFY有效负载中的所有“元素”数据。我需要发送更新的Id并进行另一个查询

这似乎是一个非常基本的问题。然而,我在网站上找不到类似的问题和答案

到目前为止,我唯一能想到的解决办法是在事件处理程序中标记更改,并使用计时器执行更改(这很恶心)

那么,有没有办法创建必要的命令同步? 还是其他建议