2

オブジェクトのプロパティを更新する foreach ループを取得しました。このプロパティには依存関係があり、セッターで更新します。依存関係には時間がかかり、foreach ループの後に一度だけ更新する必要があるため、これによりアプリケーションが遅くなるようです。

コード内の他の多くの場所でセッターが使用されているため、ループの後に依存関係の更新を呼び出すことはお勧めしません。それを超えて、オブジェクトは、呼び出し元の関数ではなく、依存関係を更新する責任を負う必要があります。

わかりやすくするためのコード例

//anywhere else in my other classes
private Foo[] objects;

public void UpdateFoo()
{
  //update propably hundrets of small objects
  foreach (Foo obj in objects)
  {
    obj.Property = 1;
  }
}

class Foo
{
  private int _property;
  public int Property 
  { 
    get { return _property; } 
    set
    {
      _property = value;

      //Update something anywhere else
      StaticBigFoo.Update();
    } }
}

class StaticBigFoo
{
  public static void Update()
  {
    //do something longer
  }
}

このシナリオのベストプラクティスは何ですか?

  • 私は a を使用できDependencyProperty、それは PropertyChanged-Callback ですが、依存関係は毎回更新されます。
  • Dispatcher で何かを開始し、DispatcherPriority.Backgroundそれを個別のデリゲートにフィルターすることを考えました (しかし、どのように?)
  • いくつかのトランザクション ロジックを使用できますが、そこで何を使用すればよいかわかりません。について何か読んだことがTransactionScopeありますが、このような用途に使用できますか?
4

3 に答える 3

1

によって定義されたセクションと、いくつかの GUI 要素によって提供される呼び出しを使用できBeginUpdate()ますEndUpdate()。私が意味するのは、次のようなものです。

class Foo
{
  private int _property;
  public int Property 
  { 
    get { return _property; } 
    set
    {
      _property = value;

      if(inUpdate)
        propertyChanged = true;
      else
        //Update something anywhere else
        StaticBigFoo.Update();
    } }

    static bool inUpdate = false;
    static bool propertyChanged;
    public static void BeginUpdate() { inUpdate = true; propertyChanged = false; }
    public static void EndUpdate() { inUpdate = false; if(propertyChanged) StaticBigFoo.Update(); }
}

その後

Foo.BeginUpdate();    
foreach (Foo obj in objects)
{
  obj.Property = 1;
}
Foo.EndUpdate();

これにより、必要に応じて更新を延期できます。

于 2013-05-31T07:24:29.203 に答える
1

プロパティは主に、制御された方法でフィールドの値を取得/設定するために使用されます。または、あなたの場合、変更通知であるさらに1マイル。おそらく、検証、遅延読み込みを行うことができます。しかし、セッター内でそれ以上のことをしているようですが、これはベストプラクティスではありません。なぜなら、プロパティに頻繁にアクセスする可能性が高く、プロパティが評価されるため、基になるロジックが発生するからです。

于 2013-05-31T07:22:39.583 に答える