2

イベントを監視するクラス B (INotifyPropertyChanged の実装) があります。これは、イベント通知を受け取るクラス A 内にあります。クラス B が生成するイベントは非常に頻繁に発生することが多いため、次のことを行います。

  1. スレッド ThA でクラス A のコードを実行します (含まれているクラス B とは対話しません)。

  2. スレッド ThB でクラス B のコードを実行し、イベントが発生すると、それを含むクラス A にイベントを通知する前に (ThA のディスパッチャで呼び出しを行うことによって)、ThA がクラス A によって使用されていないことを確認します。 . このようにして、ThA のみが A 内で実行されるように維持し、クラス B からの通知で ThA が圧倒されるのを回避します (クラス B からの情報は、「ThA に時間がある場合のみ」クラス A のイベントを作成します)。

だから、それはこのように見えるかもしれません -

public class A
{
     private B b
     private Thread ThA

     public A
     {
         b= new B(ThA);
         b.PropertyChanged+=..
     }

     Event1 callback running on ThA
     Event2 callback running on ThA
     Callback for b (invoked in ThA)
}

public class B : INotifyPropertyChanged
{
       private Thread ThA
       private Thread ThB

       public B(ThA_)
       {
            ThA=ThA_;
       }

       private void EventInClassB_Updated(object sender, Args e)
       {
            if (ThA is not being used for anything)
            {
                DispatcherForThreadA.invoke( notifyPropertyChanged() ); //send the callback to class A
            }
       }

}

これを行うためのよりスマートな方法があるかどうかを知っている人はいますか?そうでない場合は、「ThAは何にも使用されていません」

ありがとう!クリス

4

1 に答える 1

2

モニターまたはミューテックスを使用して、ThA へのアクセスを制御できます。呼び出すだけMonitor.TryEnterでロックを取得できます。失敗した場合TryEnterは、ThA が使用されています。Monitor.ExitThAが終わったら必ずコールしてください。

a を使用するコードMutexも同様です。一般に、 のMonitor方がパフォーマンスが向上しますが、アプリ ドメインの境界を越えて使用することはできません。

于 2012-10-16T16:59:26.547 に答える