2016-12-13 9 views
-1

プロパティーはIList <IMyPlayer> Players {}です。これはゲームサーバーが呼び出されるたびに同期します。私はforループでカウントを制限したときにすべてのインクリメントが更新されるかどうかを知る必要があります。理由は、私はこのループ中にプレイヤーがゲームを離れることを心配しているからです。プロパティが呼び出されるたびにその要素を更新するのは安全ですか?

編集これはシングルスレッドアプリケーションです。

public static IList <IMyPlayer> Players 
{ 
    get 
    { 
     playersField.Clear(); //GetPlayers() just adds without overwriting so list must be cleared every time. 

     if (Debugging == false) 
     { 
      MyAPIGateway.Multiplayer.Players.GetPlayers (playersField); //everytime the project needs to see all players, this will update. Little heavier on performance but its polymorphic. 
     }  
     return playersField.AsReadOnly(); 
    } 
} 

for (int i = 0; i < AttendanceManager.Players.Count; i++) 
{ 
    if (AttendanceManager.Players[i].SteamUserId == MyAPIGateway.Multiplayer.MyId) 
    { 
     //do stuff 
    } 
} 
+0

複数のスレッドを使って作業している場合、 'Players'リストの周りに' lock'があるとこれを防ぐことができます – NtFreX

+0

こんにちはこれはシングルスレッドアプリケーションです。 –

+0

@ Dr.FreとSamuel:最後のループでは、Players.Countがキャッシュされていても、この行: 'AttendanceManager.Players [i] .SteamUserId'はすべてのループ反復でゲッターを呼び出し、呼び出しますClear、GetPlayers、およびAsReadOnlyを繰り返します。それは非常に悪い考えです。通常。 – quetzalcoatl

答えて

1

私はあなたのアプローチにはいくつかの潜在的な問題を見ることができます:

  • あなたはそれをループ、だけループしている間カウントが到達するまであなたがアイテムを追加します。だから、任意の追加された項目は、クライアントが一度だけゲッターを呼び出しますforeachを使用して、その
  • を認識していない場合は、パフォーマンス上の問題を意味するかもしれない
  • あなたのゲッターは「ノーマル」ゲッター以上にやっているforループによってアクセスされていません、あなたのforループとは異なる動作をします。

あなたはこれをしたい場合は、私が代わりにあなたが方法の一部として何かを作成し、ちょうどプロパティの現在の値を取得していないこと、それが明確になりGetPlayers()機能になるだろう。クライアントが毎回リストをリロードしたいのであれば、コードを見れば分かります。例えば

for (int i = 0; i < AttendanceManager.GetPlayers().Count; i++) 
{ 
    if (AttendanceManager.GetPlayers()[i].SteamUserId == MyAPIGateway.Multiplayer.MyId) 

は、はるかに危険な標準プロパティのゲッターよりも見えます。

1

私はこれを最も確実にしません。

プロパティを使用するたびに、APIを呼び出します。それはパフォーマンスにとってひどいことになるでしょう。たとえあなたがそうでないと思っても、あなたの財産が何度も呼び出されることはとても簡単です。私が考えることのできる1つの例は、シリアライゼーション、またはこれを引数としてMVCまたはWeb APIコントローラメソッドを使用する場合です。

これは、一般的に副作用と呼ばれるもので、ゲッターですべての費用をかけて回避したいものです。

関連する問題