2015-08-09 100 views
2

我試圖通過編寫一個非常簡單的應用程序來學習SignalR ......它基本上定期發送「Hello」(如Stock Ticker,但更簡單)。SignalR無法調用非委託類型

這裏是我的樞紐:

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(); 
    } 
} 

我得到一個RuntimeBinderExceptionstockTickerHub.Clients.All().hello();我。它說:

型 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' 未處理的異常發生在System.Core.dll

其他信息:無法調用非委託類型

我究竟做錯了什麼?

客戶端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> 

回答

9

簡單的改變:

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

到:

stockTickerHub.Clients.All.hello(); 

調試器應該已經告訴你這個錯誤。更新後我嘗試了你的代碼。這是工作。

在代碼設計中的一句話:

我不會開始在hello事件的新發送線程,這將開始每到這個方法是由任何客戶端調用的時候之一。我不認爲這就是你想要做的。作爲一個更平滑的例子,你可以在Startup類中啓動代碼。 (如果您希望每個連接的代碼都可以覆蓋OnConnected,請獲取客戶端的連接ID並給他們單獨的代碼...)

+0

啊,它非常簡單。我剛剛開始,所以我不確定正確的做法 - 感謝提示。 – Gigi