2015-02-05 1 views
0

Я очень знаком с SignalR. Я пытаюсь создать имитационный конвейер, который многие клиенты могут просматривать положением конвейера (имитируемый конвейер является jQuery ui progressbar).Как сообщить о прогрессе всем клиентам, использующим MVC и собственный хост signalr

То, что у меня есть (и опубликовано ниже), работает по многим клиентам - но чем больше клиентов вы открываете, тем быстрее работает конвейер. почти кажется, что каждое нажатие на клиента по очереди отправляется обратно на сервер и так далее.

Мой вопрос: как можно несколько клиентов просматривать этот имитируемый конвейер и не увеличивать скорость конвейера быстрее на количестве клиентов, просматривающих его?

код Hub

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(); 
     } 
    } 
} 

Index.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> 

Любая помощь будет очень цениться.

ответ

1

Проблема эта линия:

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

Попробуйте вместо этого, проблема заключается в том, что вы рассказываете для каждого клиента, чтобы увеличить позицию конвейера. Таким образом, вы увеличиваете ровно один раз:

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

Спасибо за ответ, но он по-прежнему ускоряется, когда добавляется больше клиентов. Также с этим изменением все клиенты сбрасываются до 0% при открытии нового клиента – LWarthen

+0

Ой, извините, создано ли более одного концентратора? Я подозреваю. Это создаст несколько таймеров, потому что ConveyorPosition статично. Это увеличилось бы с добавлением парней. –

+0

спасибо. вы дали мне идею. Поскольку таймер создается в инициализации и вызывается из OnConnected, создается новый таймер для каждого подключаемого клиента. Я поставил остановку в инициализации, и это именно то, что она делает. Теперь, как я могу получить несколько концентраторов, чтобы увидеть только один таймер? Я сделал таймер статичным, и он сработал. еще раз спасибо – LWarthen

 Смежные вопросы

  • Нет связанных вопросов^_^