SignalR缺少客户端调用方法

时间:2013-11-07 14:53:01

标签: c# multithreading signalr

我需要实时向客户端发送字符串,但我的代码只能用于睡眠。 如果我减少睡眠参数,则会错过一些呼叫。 我的集线器类是空的,因为我不需要客户端到服务器的调用。 这是我的aspx文件: 客户(aspx):

var myhub = $.connection.chatHub;
myhub.client.broadcastMessage = function (message) {
    $('#container').append(message);
};
$.connection.hub.start();

服务器(c#):

protected void Button1_Click(object sender, EventArgs e)
{            
    Thread t = new Thread(novaThread);
    t.Start();
}

static void novaThread() {
    var hubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
    for (int i = 0; i < 20; i++)
    {
        hubContext.Clients.All.broadcastMessage("Server datetime: " + DateTime.Now.ToString());
        Thread.Sleep(1000);
    }   
}

1 个答案:

答案 0 :(得分:1)

如果要在服务器上调用客户端方法,则仍需要集线器。枢纽是使这种联系永久化的原因。它听起来像是需要重命名。

var myhub = $.connection.chatHub;
myhub.client.broadcastMessage = function (message) {
        $('#container').append(message);
};

$.connection.hub.start();
如果您在服务器上调用ChatHub,那么

testHub绝对没有任何意义。因此,我已经更新了您的javascript来调用chatHub,而不是像您一样调用testHub。只需确保您在客户端中创建一个chatHub实例,您就应该能够摆脱Thread.Sleep(1000)(假设您实际上并不需要它)并且您和#39;能够完美地向客户广播。

修改

根据您的评论,可能是您实际上开了很多线程。根据您运行的线程数量,您可能需要增加每个域的并发客户端连接数。默认值为2。见http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx