【发布时间】:2018-01-02 15:18:32
【问题描述】:
我正在使用 SignalR 启动进程并提供有关其状态的实时进度条。我的 SignalR 工作正常,客户端按钮调用集线器中的存档功能:
public class ProgressHub : Hub
{
private static IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<ProgressHub>();
public void archive()
{
ArchiveFunctions.ArchiveData();
}
public static void SendArchiveProgress(int width, string value)
{
hubContext.Clients.All.updateArchiveProgress(width, value);
}
}
这只是在循环数据库行的类上调用静态 void,所有这些代码都可以正常工作。此代码的一部分计算出到目前为止它已经完成了多少行,并在每行之后调用 SignalR 函数通知用户:
public class ArchiveFunctions {
public static void ArchiveData() {
// gets data etc
// loops records, below line occurs for each record
ProgressHub.SendArchiveProgress(progressaspercentage, value);
}
}
所有代码似乎都在工作,但是 SendArchiveProgress 不会更新客户端,直到 void 完成运行,然后所有消息同时出现。如果我在 void 中放置一个断点,那么它会在遇到消息时收到消息。我尝试使用 async/await,但我对使用它知之甚少,虽然我没有遇到任何错误,但它似乎不起作用。
如果我遗漏了一些明显的东西,请说出来,这样我就可以删除问题而不是在不提供理由的情况下投反对票,这非常令人沮丧。
请求的JS代码:
$(function () {
var chat = $.connection.progressHub;
chat.client.updateArchiveProgress = function (width, value) {
$('.progress-bar').css('width', width + '%').attr('aria-valuenow', width);
$("#lblProgress").text(value);
};
// Start the connection.
$.connection.hub.start().done(function () {
$('#btnStart').click(function () {
$('.progress-bar').css('width', '0%').attr('aria-valuenow', '0');
$("#lblProgress").text("Starting process...");
$("#modProgress").modal();
chat.server.archive();
});
});
});
更新:我很尴尬地承认,简单的原因是 ArchiveData() 中的代码块运行得如此之快,它似乎在最后发送了所有内容,并且在运行 void 的信号器上稍有延迟有助于给人这种印象.所以实际上所有这些代码都运行得很好,我通过添加一些简单的循环代码来测试它,在每条记录之间添加一些额外的秒数,使其运行时间更长。不确定我是否应该将问题删除为没有答案或离开以帮助他人??
【问题讨论】:
-
您能否发布剩余代码,其中包括对
SendArchiveProgress的调用 -
我不确定您想要哪个代码,因为其余的与我的问题无关。 ArchiveData() 只是类上的一个静态 void 并循环数据库记录,并且每个记录都调用上述行
-
@PaulF 谢谢,但如果可能的话,我想坚持使用 SignalR 方法
-
请用您拥有的客户端代码更新您的问题。