1

次の問題があります: マルチスレッド WPF アプリケーション、モデル ビュー プレゼンターの実装。一緒に属するプレゼンターとビューは別のスレッドで作成され、別の Dispatcher を取得します。ここで、誰かが別のスレッドからプレゼンターのメソッドを呼び出します。私は呼び出しをインターセプトしており、問題が発生しています。呼び出しがプレゼンターと同じスレッドからのものである場合は、呼び出しを続行し、それ以外の場合は Dispatcherthread で呼び出しを呼び出して、気にする必要がないようにします。 UI 呼び出し。SynchronizationContext の使用については既に読んだことがありますが、呼び出し元のスレッドが UI スレッドではない場合、2 つのコンテキストを比較できないため、うまくいかないようです。可能な、実用的でエレガントなソリューションは何ですか?

4

2 に答える 2

3
if( presenterDispatcherObject.CheckAccess() )
   Doit();
else
  presenterDispatcherObject.BeginInvoke( DispatcherPriority.Normal, () => DoIt() ); 
于 2008-12-04T15:23:28.800 に答える
0

Dispatcher 呼び出しをブロックする (リターンを待つ) 場合は、BeginInvoke の代わりに Invoke を使用します。これは、実際に関数を直接呼び出す動作の多くを模倣します。Invoke は、関数が終了するまでスレッドの呼び出しをブロックします (Win32 SendMessage に似ています)。BeginInvoke は、関数が返されるのを待たずに投稿して返すだけです (Win32 PostMessage のように)。

CheckAccess が遅い。さまざまなスレッドでの呼び出しを少なくすることで、CheckAccess を制限します。

public delegate bool MyFuncHandler(object arg);

bool ThreadedMyFunc(object arg)
{
    //...

    bool result;

    //...

    // use dispatcher passed in,  I would pass into the contructor of your class
    if (dispatcher.CheckAccess())
    {
        result = MyFunc(arg);
    }
    else
    {
        result = dispatcher.Invoke(new MyFuncHandler(MyFunc), arg);
    }

    return result;
}

bool MyFunc(object arg)
{
    //...
}
于 2008-12-05T02:36:40.187 に答える