我正在使用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完成运行后,然后所有消息立即进入。如果我在空格中放置一个断点,那么它会在它击中它时得到消息。我试图使用async / await,但我对使用它几乎一无所知,虽然我没有错误,但它似乎没有用。
如果我遗漏了一些明显的东西,请说明我可以删除问题而不是downvote而不提供理由,这非常令人沮丧。
要求的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()中的代码块运行得如此之快,它似乎只是在最后发送所有内容并且在运行虚空的信号器上稍有延迟有助于给人留下这样的印象。所以实际上所有这些代码都运行良好,我通过添加一些简单的循环代码来测试它,在每条记录之间添加一些额外的秒,以使其运行更长时间。不确定我是否应该删除这个问题作为没有答案或者离开去帮助别人?
根据我对这个问题的更新,我觉得我应该自己回答这个问题,让代码能够为其他人提供良好的工作,因为它还展示了如何从控制器或其他类调用信号器功能。