SignalR无法调用非委托类型

时间:2015-08-09 11:15:05

标签: signalr

我正在尝试通过编写一个非常简单的应用程序来学习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>

1 个答案:

答案 0 :(得分:15)

简单地改变:

stockTickerHub.Clients.All().hello();

为:

stockTickerHub.Clients.All.hello();

调试器应该已经告诉你这个错误。我在更新后尝试了你的代码。它正在发挥作用。

关于代码设计的评论:

我不会在hello事件中启动一个新的发送线程,每次在任何客户端调用此方法时都会启动它。我不认为那是你想做的。作为一个更平滑的例子,您可以在Startup课程中启动自动收报机。 (如果你想要每个连接的代码覆盖OnConnected,请获取客户端的连接ID并给它们单独的代码......)