0

Windows Phone 開発における静的解析だけでは、ソース コードから UI 上でどのコードが実行されているかを理解できるのでしょうか。

Dispatcher.(Begin)Invoke が不必要に使用されている場所を見つける静的分析を実装しようとしています。

これらは、UI スレッドが確実に実行される場所です。

  • 「RoutedEventArgs」をパラメーターとして取得するイベント ハンドラー
  • UI 要素のコンストラクター
  • 上記のメソッドのメソッド呼び出しの定義 (これらのイベント ハンドラー メソッドと UI コンストラクターの呼び出しグラフを推移的に見ることを意味します)

他の場所はありますか、それとも上記のリストについて何か問題がありますか?

4

2 に答える 2

0

Dispatcher.BeginInvoke が実際にいつ必要になるかを調べます。その逆ではありません。

バックグラウンド スレッドで開始される可能性のある非同期完了イベントを処理する場合を除いて、ほとんど必要ないため、UI で何かを実行したい場合は、それを UI スレッドにマーシャリングする必要があります。

つまり、バックグラウンド スレッドから UI を操作する必要がない限り、その必要はありません。

グレッグ

于 2013-08-25T12:17:43.627 に答える
0

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);

とはいえ、コードが正しく記述されていれば、この種のトリックが必要になることはほとんどありません。

于 2013-08-24T22:09:20.370 に答える