特定の間隔の後に、ハブを使用してサーバーから接続されているすべてのクライアントにデータを送信したいと思います。Signalrハブを使用してこれを実現するにはどうすればよいですか。
4 に答える
System.Threading.Timerを起動し、そのコールバックから特定のハブを使用してメッセージをブロードキャストします。
Global.asax:
private Timer timer;
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapHubs("~/signalr2");
timer = new Timer(TimerCallback(timerCallback), null, Timeout.Infinite, 1000);
}
}
SignalRwikiページの「ハブの外部からのハブを介したブロードキャスト」セクションを確認してください。
ReactiveExtensionsを使用してから、 Observable.Interval呼び出しを設定します。次に、reactiveは、クライアントにブロードキャストできるラムダを自動的に呼び出します。
JasonRobertsによるこの投稿に出くわしました=> http://dontcodetired.com/blog/post/Using-Server-Side-Timers-and-SignalR-in-ASPNET-MVC-Applications.aspx
彼は、IRegisteredObjectとHostingEnvironment.RegisterObjectを使用してから、作業を行うクラスでSystem.Threading.Timerを使用します。私自身は試していませんが、まさにそのようなものに見えます。
追加するだけ
Thread.Sleep(5000);
sendメソッドで。
元:
public void Send(string name, string message)
{
Thread.Sleep(5000);
//call the broadcast message to upadate the clients.
Clients.All.broadcastMessage(name, message);
}
それが役に立てば幸い。
編集
次のコードは、5秒ごとに現在の時刻をレンダリングします。
そのためのスクリプトは次のとおりです。
<script type="text/javascript">
$(function () {
$.connection.hub.logging = true;
$.connection.hub.start();
// Declare a proxy to reference the hub.
var chat = $.connection.chatHub;
//Appending the responce from the server to the discussion id
chat.client.currentTime = function (time) {
$('#discussion').append("<br/>" + time + "<br/>");
};
// Start the connection.
$.connection.hub.start().done(function () {
//Call the server side method for every 5 seconds
setInterval(function () {
var date = new Date();
chat.client.currentTime(date.toString());
}, 5000);
});
});
</script>
<div id="discussion"></div>
そして、HubClassに次のように書きます。
public class ChatHub: Hub
{
public void currentTime(string date)
{
Clients.All.broadCastTime(date);
}
}