0

SignalR を使い始めたばかりで、現在取り組んでいるタスクに適したツールであるかどうか疑問に思っています。

つまり、時間の経過とともに変化するプロパティを持つオブジェクトがあります。これらのプロパティを更新するために、タイマー ジョブが時々実行されます。説明のために、特定の DateTime に達すると変更されるプロパティ「isExpired」を持つ MilkJugs があるとします。

私のタイマー ジョブが MilkJug をヒットし、それを isExpired = true に切り替えたときに、すべてのクライアントが即座に通知を受け取るようにしたいと考えています。クライアントが Chrome で 7 つの MilkJugs を見ている場合、7 つすべての MilkJugs が黄色 (またはそのようなもの) に変わるのを見てもらいたいと思います。

これらの通知を timerJob からクライアントに「ブロードキャスト」するために signalR を使用できますか? 私は彼らが持っているチャットの例を実行しましたが、動作するのは非常に簡単に思えます...私はこのサーバーサイドのようなことをすることができると思います:

public class ChatHub : Hub
{
    public void Send(List<MilkJugUpdate> updates)
    {
        // Call the broadcastMessage method to update milkJugs.
        Clients.All.broadcastMessage(updates);
    }
}

次に、クライアント側でシリアル化された配列を反復処理し、JS ビューモデルの適切なフィールドを更新します。

これは正しいと思いますか?

4

2 に答える 2

2

確かに、ShootRはすでにこれを行っています (HTML5 マルチプレイヤー ゲーム)。これは、nugetの株式ティッカー サンプルでも行われます。

最終的に、ハブの外部でハブ コンテキストを取得し、それを使用してメッセージを送信できます。

public void MyTimerFunction(object state)
{
    GlobalHost.ConnectionManager.GetHubContext<ChatHub>().Clients.All.broadcastMessage(updates);
}
于 2013-03-28T22:25:38.380 に答える
2

あなたはそこに基本的な考えを持っています。ただし、おそらくいくつかの改善点があります。

ここでは、タイマー ジョブを実行するたびにメッセージを送信するとします。これは必要ありません。何かが変更された場合にのみ、クライアントにメッセージを送信する必要があります。

まず、onconnected イベントを処理し、ミルク ジャグの現在の状態を送信できます。

タイマー ジョブを実行すると、何かが変更された場合にのみ send を呼び出す必要があります。次に、クライアントにメッセージを送信して、何が変更されたかを伝えます。クライアント側では、関数は次のような変更を処理します

サーバ

public class ChatHub : Hub
{
    public override Task OnConnected()
    {
        //some code here to fetch current state of jugs.
        return base.OnConnected();
    }        

    public void JugExpired(MilkJugUpdate update)
    {
        // Call the broadcastMessage method to update milkJugs.
        Clients.All.updateJug(update);
    }
}

クライアント

ChatHub.client.updateJug = function(update) {
    // code to update jug here
}

これにより、何も変更されていない場合にクライアントにメッセージを送信する必要がなくなります。

同様に、別の回答で指摘されているように、タイマー ジョブからクライアント メソッドを直接呼び出すこともできますが、毎回状態全体を送信するのではなく、更新のみを送信することをお勧めします。

于 2013-03-28T22:28:01.500 に答える