我正在尝试通过编写一个非常简单的应用程序来学习SignalR ...它基本上定期发送“Hello”(比如Stock Ticker,但更简单)。
这是我的中心:
public class StockTickerHub : Hub
{
public void Hello()
{
var s = StockTicker.stockTicker;
Clients.All.hello();
}
}
...这里是应该定期发送消息的代码:
public class StockTicker
{
public static StockTicker stockTicker = new StockTicker();
private Thread thread;
public StockTicker()
{
var stockTickerHub = GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>();
this.thread = new Thread(() =>
{
while (true)
{
stockTickerHub.Clients.All().hello();
Thread.Sleep(1000);
}
}
);
this.thread.Start();
}
}
我在RuntimeBinderException
获得stockTickerHub.Clients.All().hello();
。它说:
System.Core.dll中出现未处理的“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型异常
其他信息:无法调用非委托类型
我做错了什么?
客户端JavaScript如下所示,以防万一你需要复制它。
<script type="text/javascript">
$(function () {
var chat = $.connection.stockTickerHub;
chat.client.hello = function () {
$("#log").append("Hello");
}
$.connection.hub.start().done(function () {
chat.server.hello();
});
});
</script>
答案 0 :(得分:15)
简单地改变:
stockTickerHub.Clients.All().hello();
为:
stockTickerHub.Clients.All.hello();
调试器应该已经告诉你这个错误。我在更新后尝试了你的代码。它正在发挥作用。
关于代码设计的评论:
我不会在hello
事件中启动一个新的发送线程,每次在任何客户端调用此方法时都会启动它。我不认为那是你想做的。作为一个更平滑的例子,您可以在Startup
课程中启动自动收报机。 (如果你想要每个连接的代码覆盖OnConnected
,请获取客户端的连接ID并给它们单独的代码......)