1

私は SignalR を初めて使用し、実行時間の長い結果プーリングを実装しようとしています。ASP.NET MVC アプリに JS を追加し、バグ クラスを作成しました。

JS

  <script type="text/javascript">
        var message= $.connection.messageHub;
        $(function () {
            message.addMessage = function (htmlstring) {            
                alert(htmlstring);
            };

            $.connection.hub.start(function () {
                message.longRunningMethod('@HttpContext.Current.Session.SessionID');
            });        
        });
    </script>

c# コード

[HubName("messageHub")]
public class MessagesHub : Hub
{
public void longRunningMethod(string sessionId)
{
   var repeatChecking = 0;
   while (repeatChecking < 3000000)
       {
          Caller.addMessage("Test");
          repeatChecking++;
          Thread.Sleep(TimeSpan.FromSeconds(1));                        
       }
}
}

コードは問題なく動作しますが、問題が 1 つあります。同じユーザーが Web ページを更新するたびに、新しい Hub クラスが作成され、新しい longRunningMethod メソッドが実行されます。接続を再開して同じハブ インスタンスにアタッチし、メッセージの受信を再開したいと考えています。誰かがこれを実装する方法を説明できますか?

4

1 に答える 1

3

ハブは非常に頻繁に作成および破棄されるため、持続すると予想されるデータを絶対に配置しないでください (静的でない限り)。

データを取り込むことができる長時間実行されるメソッドを探している理由はよくわかりません (SignalR は常に稼働しており、データの取り込み/処理に使用できるため)、それを行う方法は次のとおりです。

SignalR 株式ティッカーの例を確認してください (Nuget 経由で取得できます)。タイマーを起動する単一のインスタンス クラスを作成します。そのタイマーは、データをクライアントにブロードキャストするために使用されます。https://github.com/SignalR/SignalR-StockTicker

ShootR もご覧ください。これは、SignalR で構築されたマルチプレイヤー ゲームであり、ほとんど同じことを行います。サーバー上でゲーム ループとして機能するバックグラウンド タイマーを作成し、データをクライアントにプッシュします。https://github.com/NTaylorMullen/ShootR

最終的に、ソリューションには、「長時間」実行されるメソッドとして機能するシングルトンまたは静的タイマーの作成が含まれます。

お役に立てれば!

于 2012-10-12T17:45:57.183 に答える