2012-02-15 3 views
2

私は次のような機能を持っている:私のコードにDispatcher.Invoke/BeginInvokeを使用すると、本質的にコードの一部に対して相互に排他的なアクセスが提供されますか?

public void Increment() 
{ 
    if (Count == 0) 
    { 
     AttachResource(); 
    } 

    Count++; 
} 

変更は、この機能は、複数のスレッドから呼び出されることを意味します。 AttachResource()の性質上、この関数はメインスレッド上で実行する必要があります。

は、私は次のように機能を変更すると仮定します

public void Increment() 
{ 
    _dispatcher.Invoke(new Action(() => 
    { 
     if (Count == 0) 
     { 
      AttachResource(); 
     } 

     Count++; 
    })); 
} 

は、私がスレッドによる相互に排他的アクセスを確保するためにも、このコードにロックを追加する必要がありますか?あるいは、ディスパッチャを介した呼び出しは、複数の呼び出しをメインスレッドにシリアル化することによって自然にこれを達成するでしょうか?

+0

特定のスレッドでのみ実行されるコードからアクセスされるリソースは、ロックで保護する必要はありません。ロックアウトできるものは何もありません。 –

+0

ありがとうございます!私のアプローチの健全性チェックは高く評価されています。 – Nathanael

答えて

2

例では、何か他のものがCountをリセットしない限り、AttachResourceが複数回呼び出されることはありません。

DispatcherがUIのディスパッチャインスタンス(たとえばApplication.Current.Dispatcher)であると仮定すると、UIスレッドのみがこのコードパスからAttachResourceを呼び出します。

+0

あなたの前提は正しいです、参照された_dispatcherはメインのUIスレッド用です。 – Nathanael

+0

この場合、ロックは必要ありませんが、Countの使用は、Countが0以外にリセットされていない限り、これを一度だけ実行できることを示しています。 –

+0

私がリストしなかった匹敵するデクリメント機能があります。私は共有リソースの参照カウントの非常に基本的な形をしています。 – Nathanael

関連する問題