【发布时间】: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