【问题标题】:How to report progress to all clients using MVC and self host signalr如何使用 MVC 和自主机信号器向所有客户端报告进度
【发布时间】:2015-02-06 03:51:28
【问题描述】:

我对 SignalR 很陌生。 我正在尝试创建一个模拟传送带,许多客户可以查看传送带的位置(模拟传送带是一个 jQuery ui 进度条)。

我所拥有的(以及在下面发布的)适用于许多客户 - 但是您打开的客户越多,传送带的运行速度就越快。似乎每次推送到客户端都会依次发回服务器等等。

我的问题是如何让多个客户查看此模拟传送带,而不是让传送带根据查看它的客户数量更快地增加?

中心代码

 public class ConveyorHub : Hub
{
    public static  int ConveyorPosition { get; set; }
    private Timer _timer;
    public override Task OnConnected()
    {
        Initialize();
        return base.OnConnected();
    }

    private void Initialize()
    {
        ConveyorPosition = 0;
        if (_timer == null)
        {
            _timer = new Timer(1000);
            _timer.Elapsed += (s, e) => Clients.All.reportConveyorMovement(ConveyorPosition++);
            _timer.Start();
        } 
    }
}

索引.cshtml

<div class="progress-container">
<label class="progress-name">Simulated Conveyor</label>
<div id="progressbar">
    <div class="progress-label">Loading...</div>
</div>

<link rel="stylesheet" href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">
<script src="~/Scripts/jquery-2.1.3.js"></script>
<script src="~/Scripts/jquery-ui-1.11.2.js"></script>
<script src="~/Scripts/jquery.signalR-2.2.0.js"></script>
<script src="~/Scripts/hubs.js"></script>
<script type="text/javascript">
    $(function () {
        var progressbar = $("#progressbar");
        var progressLabel = $(".progress-label");

        $.connection.hub.url = "http://localhost:8080/signalr";
        var conveyorHub = $.connection.ConveyorHub;

        conveyorHub.client.reportConveyorMovement = function(val) {
            progress(val);
        };

        progressbar.progressbar({ value: 0 });

        function progress(val) {
            var progressbarValue = progressbar.find(".ui-progressbar-value");
            if (val >= 75 && val < 99) {
                progressbarValue.css({
                    "background": 'yellow'
                });
            }
            if (val >= 99) {
                progressbarValue.css({
                    "background": 'red'
                });
            }
            progressbar.progressbar("value", val);
            progressLabel.text(progressbar.progressbar("value") + "%");
        }

        $.connection.hub.start()
            .done(function() {
                $("#progressbar").change(function() {

                });
            }).fail(function() { console.log('Could not Connect!'); });
    });
</script>

任何帮助将不胜感激。

【问题讨论】:

    标签: c# signalr signalr-hub signalr.client


    【解决方案1】:

    问题出在这一行:

    _timer.Elapsed += (s, e) => Clients.All.reportConveyorMovement(ConveyorPosition++);
    

    试试这个,问题是你告诉每个客户增加传送带的位置。这样你就可以精确地增加一次:

    _timer.Elapsed += (s, e) => {
           ++ConveyorPosition;
           Clients.All.reportConveyorMovement(ConveyorPosition);
    };
    

    【讨论】:

    • 感谢您的回复,但是添加更多客户端后仍然会加快速度。同样通过该更改,当打开新客户端时,所有客户端都会重置为 0%
    • 抱歉,是否创建了多个集线器?我怀疑是这样。这将产生多个计时器,因为 ConveyorPosition 是静态的。随着帅哥的加入,这会增加。
    • 谢谢。你给了我一个想法。由于计时器是在初始化中创建的,并且是从 OnConnected 调用的,因此会为每个连接的客户端创建一个新的计时器。我停止了初始化,这正是它正在做的事情。现在我怎样才能让多个集线器只看到一个计时器?我将计时器设置为静态并且它起作用了。再次感谢
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多