我正在尝试通过编写一个非常简单的应用程序来学习SignalR ...它基本上定期发送"Hello"(比如股票代码,但更简单).
这是我的中心:
public class StockTickerHub : Hub
{
public void Hello()
{
var s = StockTicker.stockTicker;
Clients.All.hello();
}
}
Run Code Online (Sandbox Code Playgroud)
...这里是应该定期发送消息的代码:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我得到一个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>
Run Code Online (Sandbox Code Playgroud)
DDa*_*Dan 16
只需更改:
stockTickerHub.Clients.All().hello();
Run Code Online (Sandbox Code Playgroud)
至:
stockTickerHub.Clients.All.hello();
Run Code Online (Sandbox Code Playgroud)
调试器应该已经告诉你这个错误.我在更新后尝试了你的代码.这是工作.
关于代码设计的评论:
我不会在hello事件中启动一个新的发送线程,每次这个方法被任何客户端调用时都会启动它.我不认为那是你想做的.作为一个更平滑的例子,你可以在Startup课堂上启动自动收报机.(如果你想要每个连接覆盖一个滚动条OnConnected,获取客户端的连接ID并给它们单独的代码......)
| 归档时间: |
|
| 查看次数: |
2029 次 |
| 最近记录: |