0

C#WPFプロジェクトには、いくつかのUserControlを更新する必要があるバックグラウンドスレッドがあります。そのために、Dispatcher.Invokeを使用しました。

    Dispatcher.Invoke(DispatcherPriority.Normal, (MethodInvoker)delegate()
    {
        // Code
    }

しかし、私は疑問に思っています:

  • デリゲート内のコードがメインスレッドで実行されるのはいつですか?
  • それを実行するために、メインスレッドで通常実行されているメソッドを停止できますか?
  • Dispatcher.Invokeを使用すると、競合状態につながる可能性がありますか?

どうもありがとう、エマヌエーレ

4

2 に答える 2

2

デリゲート内のコードがメイン スレッドで実行されるのはいつですか?

すべてのoperations with priority greater than Normal got a chance to execute.

それを実行するには、メインスレッドで通常実行されているメソッドを停止できますか?

Invoke メソッドはデリゲートをメイン スレッドで同期的に実行しますが、非同期で実行する場合は、BeginInvoke を使用する必要があります。一部のデリゲートがメイン スレッドで実行されている場合、delegate will get queued and will run once executing operation gets completed. ただし、デリゲートが実行されない限り、バックグラウンド スレッドは先に進みません。

Dispatcher.Invoke を使用すると競合状態になる可能性はありますか?

No、デリゲートが Dispatcher Queue にキューに入れられるため、そうではありません。

于 2013-03-02T12:47:04.440 に答える
0
  1. UI スレッドがSynchronizationContext.Send呼び出し時に実行を切り替えることができる正確なタイミング。
  2. yieldそれを実行すると、通常メインスレッドで実行されているメソッドが実行を終了し (またはのような他の疑似非終了条件を含むawait)、関数が実行されます。
  3. いいえ。
于 2013-03-02T12:44:53.217 に答える