gpt4 book ai didi

c# - SignalR 轮询并不总是返回准确的数据库结果

转载 作者:太空宇宙 更新时间:2023-11-03 20:06:12 24 4
gpt4 key购买 nike

在我的应用程序中,我通过上传 XML 文件开始导入过程。上传后,将运行一系列存储过程并解析 xml 文件,并将数据插入到许多不同的表中。随着它的进行,Stats 表会更新以显示插入的进度。 Stats 表有 4 列:BatchIdBatchCountProcessCountErrorCount . BatchCount 是所有记录的计数。如果记录正确插入没有问题 ProcessCount 加 1,如果失败 ErrorCount 加 1。(这两列在导入过程中总是在变化)

我的主要目标是使用 SignalR 显示导入进度。我有一个轮询很好的集线器方法,因为我在我的 UI 中看到了更新的时间戳。然而,问题是计数要么始终为 0(初始值),要么非常非常偶尔地读取一次并显示随机值,如 985。如果它确实读取了一个值,它只会读取一次并且不会再次更改。这是我的集线器方法:

public void BeginPolling()
{
while (true)
{
var stats = _repository.GetImportStats();
var message = "Preparing file...";

if (stats != null)
{
message = DateTime.Now + " - Count: " + stats.ProcessCount.ToString();
}
else
{
message = DateTime.Now + " - Stats result returned null.";
}

//the message displays in a div on my UI
Clients.Caller.showProgress(message);

//I have tried various sleep times (1000, 5000, 10000)
Thread.Sleep(5000);
}
}

下面是我的 _repository.GetImportStats 方法,出于测试目的,它只是获取第一条(也是唯一一条)记录:

public Stats GetImportStats()
{
return DataContext.Stats.FirstOrDefault();
}

同样为了测试,我尝试在我的 UI 上放置一个按钮,该按钮对相同的 GetImportStats() 方法进行 ajax 调用,它总是返回 ProcessCount很好,所以我认为问题出在我的 SignalR 实现中。感谢您的帮助!

最佳答案

最好使用 GetHubContext和一个 Timer为此。

我发现 BeginPolling 的一个潜在问题是它永远不会返回。对于 WebSockets 以外的所有 SignalR 传输,这意味着每次调用 BeginPolling 时都会启动一个永无止境 XHR。

这不仅会不必要地浪费服务器资源,还可能会干扰您的客户端自 browsers limit the number of simultaneous connections that can be made to a single server 以来接收更多消息的能力。 .


附言制作 BeginPolling async并使用 await Task.Delay(...); 会阻止您使用 Thread.Sleep 不必要地保持服务器线程,但这不会解决您永远不会结束 XHR 问题。因此,我再次建议在 Hub 外部使用 GetHubContextTimer

关于c# - SignalR 轮询并不总是返回准确的数据库结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23257275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com