未使用 Npgsql 接收最新数据 LISTEN/NOTIFY
Not receiving latest data using Npgsql LISTEN/NOTIFY
我将 .NET Core 应用程序与 PostgreSQL 数据库(使用 Npgsql)结合使用,并结合 SignalR 来接收实时数据和最新数据条目。但是,我没有收到最新的条目,有时 Clients.All.SendAsync
方法会向客户端发送多个条目。这是我的代码:
向客户端发送新数据的集线器方法:
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
的条目,但是它是"old"的产品,即数据库不查询和发送最新的条目,而只查询和发送旧的通过 SignalR。但是,当我手动刷新页面时,新数据会正确显示。
我相信这与打开的单个连接有关,所以我经常只收到 "old" 组数据,但即使是这样,我也无法弄清楚为什么有时得到不止一个数据包,即使我只是想发送一个数据包,而且我只调用了一次 NOTIFY
。
我明白了。希望这对以后遇到此问题的其他人有所帮助!
问题是我在 Hub
class 中通过 .NET Core 的依赖注入声明了我的 dbContext
,每个 class 只创建了一次上下文,也因为每页或 WebSocket 事务。这就是为什么我无法获得最新数据的原因,我想,因为 dbContext
是 "old" 并且不知道变化。
我通过在我的方法中通过 using
方案使用 dbContext
解决了这个问题,在我的 SendForexAsync
方法中使用了两次(每次调用 GetForex
函数),以及 GetForex
函数本身。这样,一个 dbContext
被立即创建和处理,所以下次我通过 GetForex
函数轮询数据库以获取新数据时(当我收到来自数据库的通知时 NOTIFY
从控制台应用程序),创建了一个新的 dbContext
实例,其中可以包含该新数据。
我将 .NET Core 应用程序与 PostgreSQL 数据库(使用 Npgsql)结合使用,并结合 SignalR 来接收实时数据和最新数据条目。但是,我没有收到最新的条目,有时 Clients.All.SendAsync
方法会向客户端发送多个条目。这是我的代码:
向客户端发送新数据的集线器方法:
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
的条目,但是它是"old"的产品,即数据库不查询和发送最新的条目,而只查询和发送旧的通过 SignalR。但是,当我手动刷新页面时,新数据会正确显示。
我相信这与打开的单个连接有关,所以我经常只收到 "old" 组数据,但即使是这样,我也无法弄清楚为什么有时得到不止一个数据包,即使我只是想发送一个数据包,而且我只调用了一次 NOTIFY
。
我明白了。希望这对以后遇到此问题的其他人有所帮助!
问题是我在 Hub
class 中通过 .NET Core 的依赖注入声明了我的 dbContext
,每个 class 只创建了一次上下文,也因为每页或 WebSocket 事务。这就是为什么我无法获得最新数据的原因,我想,因为 dbContext
是 "old" 并且不知道变化。
我通过在我的方法中通过 using
方案使用 dbContext
解决了这个问题,在我的 SendForexAsync
方法中使用了两次(每次调用 GetForex
函数),以及 GetForex
函数本身。这样,一个 dbContext
被立即创建和处理,所以下次我通过 GetForex
函数轮询数据库以获取新数据时(当我收到来自数据库的通知时 NOTIFY
从控制台应用程序),创建了一个新的 dbContext
实例,其中可以包含该新数据。