gpt4 book ai didi

c# - 使用 SignalR 流式传输数据

转载 作者:太空宇宙 更新时间:2023-11-03 15:57:07 26 4
gpt4 key购买 nike

我刚刚开始使用 SignalR,我想知道如何让它为我手头的任务工作。

假设我有一个大小为 30 的列表(在 C# 中)。我想一次向客户推送该列表的 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

第二次是“我!”按下按钮

•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

无论我是否点击“DC”按钮(调用了“connection.stop()”方法),重复次数都会一直增加1。

任何建议都足够了

非常感谢!

已编辑我设法使用集线器让它工作。但是,我仍然想知道在这个低级别上到底发生了什么。我在这里做错了什么?

最佳答案

首先,PersistentConnection 仅应在您有需要它的特定场景时才使用 - 请改用 Hub。

其次,您不应该阻塞 Hub 或 PersistentConnection 对象中的线程 - 该对象表示连接操作,因此它在连接事件、断开连接事件或方法调用的生命周期内是暂时的。

相反,创建一个应用程序,然后可以调用集线器 - 在应用程序中维护计时器。有关如何调用集线器的信息,请参阅以下内容:

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

关于c# - 使用 SignalR 流式传输数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23151779/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com