2014-04-18 4 views
2

저는 SignalR을 시작했습니다. 현재 진행중인 작업을 처리하는 방법을 궁금합니다.SignalR을 사용하여 데이터를 스트리밍

크기가 30 인 목록 (C#)이 있습니다. 한 번에 그 목록의 클라이언트 x 번호로 푸시하고 싶습니다. 클라이언트가 x를 전달하면 서버는 목록의 끝까지 x를 x만큼 전달합니다.

코드가 작동하지만 이상한 결과가 표시되었습니다. 누구든지 나를 도울 수 있기를 바랍니다.

내 코드는 다음과 같습니다

내 PersistentConnection 클래스

public class MyConnection1 : PersistentConnection 
    { 
     protected override Task OnConnected(IRequest request, string connectionId) 
     { 
      return Connection.Broadcast("connection " + connectionId + " connected!"); 
     } 

     protected override Task OnReceived(IRequest request, string connectionId, string data) 
     { 
      int milisecons = 2000; 
      List<string> myList = new List<string>(); 
      myList.Add("1"); 
      myList.Add("2"); 
      myList.Add("3"); 
      myList.Add("4"); 
      myList.Add("5"); 
      myList.Add("6"); 
      myList.Add("7"); 
      myList.Add("8"); 
      myList.Add("9"); 
      myList.Add("10"); 
      myList.Add("11"); 
      myList.Add("12"); 
      myList.Add("13"); 
      myList.Add("14"); 
      myList.Add("15"); 
      myList.Add("16"); 
      myList.Add("17"); 
      myList.Add("18"); 
      myList.Add("19"); 
      myList.Add("20"); 
      myList.Add("21"); 
      myList.Add("22"); 
      myList.Add("23"); 
      myList.Add("24"); 
      myList.Add("25"); 
      myList.Add("26"); 
      myList.Add("27"); 
      myList.Add("28"); 
      myList.Add("29"); 
      myList.Add("30"); 

      int no = Convert.ToInt32(data); 

      var dividedGroupList = myList.Select((x, i) => new { Index = i, Value = x }).GroupBy(x => x.Index/no).Select(x => x.Select(v => v.Value).ToList()).ToList(); 

      dividedGroupList.ForEach(x => { Connection.Send(connectionId, x); Thread.Sleep(milisecons); }); 

      return null; 
     } 
     protected override Task OnDisconnected(IRequest request, string connectionId) 
     { 
      return Connection.Broadcast("connection " + connectionId + " disconnected!"); 
     } 
    } 

내 HTML 페이지

<!DOCTYPE html> 
<html> 
<head> 
    <title></title> 
    <script src="Scripts/jquery-1.10.2.min.js"></script> 
    <script src="Scripts/jquery.signalR-2.0.0.min.js"></script> 

</head> 
<body> 
    <script type="text/javascript"> 
     $(function() { 
      var connection = $.connection('/echo'); 
      connection.start().done(function() { 
       $('#message').append('<li>yay</li>'); 
      }); 

      $("#btn").click(function() { 
       connection.send($('#msg').val()); 

       connection.received(function (data) { 
        $('#message').append('<li>' + data + '</li>'); 
       }); 
      }); 
      $("#dcbtn").click(function() { 
       connection.stop(); 
      }); 
     }); 
    </script> 

    <input type="text" id="msg" /> 
    <input type="button" id="btn" value=" ME!" /> 
    <input type="button" id="dcbtn" value=" DC" /> 

    <ul id="message"></ul> 
</body> 
</html> 

출력 첫 번째 시간! "ME" 버튼을

•yay 
•1,2,3,4,5,6,7,8,9,10 
•11,12,13,14,15,16,17,18,19,20 
•21,22,23,24,25,26,27,28,29,30 

제 2 시간 (여기에 이미지를 게시 할 정도로 명성을 가지고하지 않는 그래서 죄송합니다)을 누르면 "저를!" 버튼을 반복의 수에 관계없이 내가 여부 (이하 "connection.stop()"메소드를 호출)은 "DC"버튼을 클릭 여부를 1로 계속 증가 할 것이다

•yay 
•1,2,3,4,5,6,7,8,9,10 
•11,12,13,14,15,16,17,18,19,20 
•21,22,23,24,25,26,27,28,29,30 
•1,2,3,4,5,6,7,8,9,10      <==== repeated here onwards 
•1,2,3,4,5,6,7,8,9,10       
•11,12,13,14,15,16,17,18,19,20 
•11,12,13,14,15,16,17,18,19,20 
•21,22,23,24,25,26,27,28,29,30 
•21,22,23,24,25,26,27,28,29,30 

을 누르면.

충분한 조언이 충분합니다.

감사합니다.

편집 나는 허브를 사용하여이 작업을 관리 할 수있었습니다. 그러나, 나는 아직도이 낮은 수준에서 실제로 일어나고있는 것을 알고 싶다. 내가 여기서 잘못하고있는 것은 무엇입니까?

답변

0

먼저 PersistentConnection은 허브가 필요한 특정 시나리오가있는 경우에만 사용해야합니다.

두 번째로 Hub 또는 PersistentConnection 객체에서 스레드를 차단하면 안됩니다. 객체는 연결 작업을 나타내므로 연결 이벤트, 연결 끊김 이벤트 또는 메서드 호출의 수명 동안 일시적입니다.

대신 허브에 전화를 걸 수있는 응용 프로그램을 만듭니다. 응용 프로그램에서 타이머를 유지 관리합니다. 허브를 호출하는 방법은 다음을 참조하십시오

http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#callfromoutsidehub

+0

글쎄, 난 관리 않았다 허브에서 작업을 얻을 수 있습니다. 낮은 수준의 영구 연결을 사용하여 더 많은 것을 이해하려고했습니다. Hub 또는 PersistentConnection 객체의 스레드가 연결, 연결 끊김 이벤트 또는 메서드 호출의 수명 동안 있다는 것을 잘 알고 있습니다. 그러나 닫고 열 때를 ​​더 자세히 제어하고 싶다면 어떻게해야합니까? 가능한가? – Kiong

+0

SignalR을 사용하여 연결 수명주기를 제어 할 수있는 방법을 생각할 수 없습니다. WebSocket을 직접 사용하여 프로그래밍 해 볼 수는 있지만 WebSockets을 사용할 수없는 경우 어떻게해야하는지 코딩해야합니다 (시나리오 중 하나 그 신호는 당신을 위해 처리합니다). 어떤 용도로 연결을 제어 할 수 있습니까? 장기 실행 프로세스를 실행하는 경우, 현재 아키텍처에서 허브 메서드 외부에서 실행하는 것이 가장 좋습니다. –

관련 문제