저는 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
을 누르면.
충분한 조언이 충분합니다.
감사합니다.
편집 나는 허브를 사용하여이 작업을 관리 할 수있었습니다. 그러나, 나는 아직도이 낮은 수준에서 실제로 일어나고있는 것을 알고 싶다. 내가 여기서 잘못하고있는 것은 무엇입니까?
글쎄, 난 관리 않았다 허브에서 작업을 얻을 수 있습니다. 낮은 수준의 영구 연결을 사용하여 더 많은 것을 이해하려고했습니다. Hub 또는 PersistentConnection 객체의 스레드가 연결, 연결 끊김 이벤트 또는 메서드 호출의 수명 동안 있다는 것을 잘 알고 있습니다. 그러나 닫고 열 때를 더 자세히 제어하고 싶다면 어떻게해야합니까? 가능한가? – Kiong
SignalR을 사용하여 연결 수명주기를 제어 할 수있는 방법을 생각할 수 없습니다. WebSocket을 직접 사용하여 프로그래밍 해 볼 수는 있지만 WebSockets을 사용할 수없는 경우 어떻게해야하는지 코딩해야합니다 (시나리오 중 하나 그 신호는 당신을 위해 처리합니다). 어떤 용도로 연결을 제어 할 수 있습니까? 장기 실행 프로세스를 실행하는 경우, 현재 아키텍처에서 허브 메서드 외부에서 실행하는 것이 가장 좋습니다. –