在代码块完成之前不会调用SignalR函数

时间:2018-01-02 15:18:33

标签: c# asp.net signalr

我正在使用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()中的代码块运行得如此之快,它似乎只是在最后发送所有内容并且在运行虚空的信号器上稍有延迟有助于那种印象。所以实际上所有这些代码都运行良好,我通过添加一些简单的循环代码来测试它,在每条记录之间添加一些额外的秒,以使其运行更长时间。不确定我是否应将问题删除为没有答案或留下来帮助别人?

1 个答案:

答案 0 :(得分:0)

根据我对这个问题的更新,我觉得我应该自己回答这个问题,让代码能够很好地为其他人提供,因为它还展示了如何从控制器或其他类调用信号器功能。