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