【问题标题】:Not receiving latest data using Npgsql LISTEN/NOTIFY未使用 Npgsql LISTEN/NOTIFY 接收最新数据
【发布时间】:2019-12-14 01:18:47
【问题描述】:

我将 .NET Core 应用与 PostgreSQL 数据库(使用 Npgsql)结合使用 SignalR 来接收实时数据和最新数据条目。但是,我没有收到最新的条目,有时Clients.All.SendAsync 方法会向客户端发送多个条目。这是我的代码:

向客户端发送新数据的 Hub 方法:

public async Task SendForexAsync(string name)
    {
        var product = GetForex(name);
        await Clients.All.SendAsync("CurrentData", product);
        using (var conn = new NpgsqlConnection(ApplicationDbContext.GetConnectionString()))
        {
            conn.Open();
            var cmd = new NpgsqlCommand("LISTEN new_forex", conn).ExecuteNonQuery();
            conn.Notification += async (o, e) =>
            {
                var newProduct = GetForex(name);
                await Clients.All.SendAsync("NewData", newProduct);
            };

            while (true)
            {
                await conn.WaitAsync();
            }
        }
    }

定期从 API 轮询新数据的控制台应用:

var addedStocksDJI = FetchNewStocks("DJI");
if (addedStocksAAPL > 0 || addedStocksDJI > 0)
{
    using (var conn = new NpgsqlConnection(ApplicationDbContext.GetConnectionString()))
    {
        conn.Open();
        var cmd = new NpgsqlCommand("NOTIFY new_stocks", conn).ExecuteNonQuery();
    }
}

应用程序的其他代码绝对正确,因为我在尝试实现 LISTEN/NOTIFY 功能之前收到了新的正确数据。但是现在,我在客户端上获得了一个(或多个)newProduct 条目,但它是“旧”产品,即数据库不查询和发送最新条目,而仅通过 SignalR 发送旧条目.但是,当我手动刷新页面时,新数据会正确显示。

我相信这与打开单个连接有关,因此我经常只收到“旧”数据集,但即使是这样,我也无法弄清楚为什么有时我会收到多个数据包,即使我只是想发送一个,而且我只调用了一次NOTIFY

【问题讨论】:

    标签: postgresql asp.net-core signalr npgsql


    【解决方案1】:

    我想通了。希望这将帮助其他人在未来遇到这个问题!

    问题是我通过 .NET Core 的依赖注入在我的 Hub 类中声明了我的 dbContext,该类只为每个类创建了一次上下文,也是因为每个页面或 WebSocket 事务。这就是为什么我无法获得最新数据的原因,我想,因为 dbContext 是“旧的”并且不知道更改。

    我通过在我的方法内部使用using 方案使用dbContext 解决了这个问题,在我的SendForexAsync 方法中使用了两次(每次调用GetForex 函数一次),以及在@ 987654328@ 函数本身。这样,dbContext 会立即创建并处理掉,因此下次我通过GetForex 函数轮询数据库以获取新数据时(当我收到来自数据库的通知时,由于来自控制台应用程序的NOTIFY ),会创建一个新的 dbContext 实例,其中可以包含该新数据。

    【讨论】:

      猜你喜欢
      • 2014-02-04
      • 2013-04-12
      • 2018-01-07
      • 2013-04-30
      • 2016-11-26
      • 2023-04-01
      • 2014-11-07
      • 2015-12-31
      • 2016-10-21
      相关资源
      最近更新 更多