Dispatcher または適切な SynchronizationContext を使用して呼び出されるすべてのメソッドは、UI スレッドで実行されます。これにより、徹底的な静的分析が不可能になります。たとえば、WebClient クラスのコールバックは UI スレッドで実行されます。これらのコーナーケースをどのように予測する必要がありますか?
簡単なヒントですが、非常に便利なのは、UI または非 UI スレッドの両方から呼び出すことができるメソッドがあることです。メソッドを呼び出すことでDispatcher.CheckAccess()
(このメソッドは Visual Studio の IntelliSense では表示されないため、発見するのは困難です)、Dispatcher を呼び出す必要があるかどうかを知ることができます。
if (Dispatcher.CheckAccess())
{
// In the UI thread
SomeMethod();
}
else
{
// Not in the UI thread
Dispatcher.BeginInvoke(SomeMethod);
}
そこから、ラッパーを作成できます。
public void CallDispatcherIfNeeded(Action method) // You might want a shorter name
{
if (Dispatcher.CheckAccess())
{
// In the UI thread
method();
}
else
{
// Not in the UI thread
Dispatcher.BeginInvoke(method);
}
}
そして、UI スレッドを使用しているかどうかを気にせずに、それを呼び出す必要があります。
CallDispatcherIfNeeded(SomeMethod);
とはいえ、コードが正しく記述されていれば、この種のトリックが必要になることはほとんどありません。