2016-10-31 4 views
1

私は単純なSignalRサーバを持っていますが、これはほとんど経験がありません。SignalRハブ変数が値を失うのを止めることができません(静的変数は問題ではありません)

マイハブクラスがある:ここでは

public class MyHub : Hub 
{ 
    public List<Player> players { get; set; } 
    public MyHub() 
    { 
     players = new List<Player>(); 
    } 
    public void Searching(Player player) 
    { 
     players.Add(player); 
     //Clients.All.a 
    } 
} 

は、私は、検索メソッドを呼び出すとMyHubクラスで私のコード内の変数

public String UserName { get; set; } 
    public IHubProxy HubProxy { get; set; } 
    const string ServerURI = "http://localhost:5051/signalr"; 
    public HubConnection Connection { get; set; } 
    public Player User { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     User = new Player(100); 
     ConnectAsync(); 
    } 

    private void btnSearch_Click(object sender, RoutedEventArgs e) 
    { 
     HubProxy.Invoke("Searching", User); 
    } 

ところ、私は(のために選手のリストをご希望であります今では)誰かがクライアントのbtnSearchをクリックするたびに追跡しています。これを行うことで、MyHubのプレーヤーリストにPlayerクラスのメンバーを追加するだけです。

何らかの理由で、私がこれを呼び出すたびに、デバッガを使用して、リストが再びヌルであることがわかり、コンストラクタが再度呼び出され、プレイヤリストが再び空になることがわかります。

他のスタックオーバーフローの問題で静的変数であることがわかりましたが、私のものは静的なものはありません。 (Playerクラスの何も静的ではありません)

答えて

1

基本的に、ハブは一時的です。つまり、インスタンスがリサイクルまたは破棄される時期を知ることはできません。これを解決する1つの方法は、状態にシングルトンを使用することですが、多くのオプションがあります。

「あなたはハブのクラスをインスタンス化したり、サーバー上で、独自の コードから、そのメソッドを呼び出すことはありませんが、すべてのことがSignalRハブ パイプラインによって、あなたのために行われます。これは、[1] MSDNからまっすぐです。 SignalRは毎回 が、それは、そのようなクライアントが接続したときのようにハブの動作を処理する必要 切断、またはサーバーへのメソッド呼び出しを行い、あなたのハブクラスの新しいインスタンスを作成します。

をハブクラスのインスタンスは一時的であるため を使用して、あるメソッド呼び出しから次のメソッド呼び出しに状態を維持することはできません。 サーバーは、クライアントからのメソッド呼び出しでは、 ハブクラスの新しいインスタンスがメッセージを処理します。複数の 接続とメソッド呼び出しを通じて状態を維持するには、 データベース、Hubクラスの静的変数、またはHubから派生しない別のクラス など、他の方法を使用します。 Hubクラスの静的変数などの メソッドを使用してデータをメモリに保持すると、アプリケーションドメインのリサイクル時にデータが失われて になります。

あなたがハブクラス外 を実行する独自のコードからクライアントにメッセージを送信したい場合は、ハブクラス インスタンスをインスタンス化することによってそれを行うことはできませんが、SignalRへの参照を取得することによってそれを行うことができます Hubクラスのコンテキストオブジェクト。詳細については、どのように コールクライアントのメソッドを参照して、このトピックの後半で ハブクラスの外からグループを管理「

[1]: はhttps://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server 『SignalRのドキュメント』

+0

が追加できます私が必要とするものを許可する、ハブなしでSignalRを使用するチュートリアルを指し示すリンク? – DaMuffiner

+0

クイック&ダーティな修正は、プレイヤーリストを別のシングルトンに入れたり、プレイリストをいくつかのDIフレームワーク – gd73

関連する問題