3

WPFアプリケーションに次の単純なコードがあります。

ThreadStart start = delegate()
{
    Thread.Sleep(5000);
    Console.WriteLine("HEY!");

    Dispatcher.CurrentDispatcher.BeginInvoke(
        DispatcherPriority.Normal,
        new Action(
            delegate()
            {
                Console.WriteLine("Inside invoke?!");
            }
        )
    );
};

new Thread(start).Start();

HEY!しばらくすると印刷され、スレッドの使用から予想されるようにアプリケーションがブロックされませんが、なぜ表示されないのInside invoke?!ですか?また、のようなさまざまな優先順位を試しSendましたが、これが最優先事項だと思います。

また、ブレークポイントを内部に配置しようとしましたが、そこで停止することはありませんでした。

4

1 に答える 1

8

最初のいくつかの基本 -

  • 各スレッドには独自の Dispatcher があり、Dispatcher.CurrentDispatcher は常に、現在実行中のスレッドの Dispatcher を返します。
  • BeginInvoke は、DispatcherPriority で指定された優先度に従って、指定されたデリゲートを非同期的に実行します。

コードの問題 - 作成したセカンダリ スレッドの Dispatcher キューにデリゲートを配置しています。しかし、セカンダリ スレッドがそれを実行する時間を得る前に、セカンダリ スレッドが終了したため、そのディスパッチャが終了しました。そのため、デリゲートは決して実行されません。

これを達成するには2つの方法があります -

次のように、ディスパッチャーでデリゲートを同期的にキューに入れます-

Dispatcher.CurrentDispatcher.Invoke(
                    DispatcherPriority.Normal,
                    new Action(
                        delegate()
                        {
                            Console.WriteLine("Inside invoke?!");
                        }
                    )
                );

または、次のように、メイン スレッド (UI スレッドと呼ばれることが多い) のディスパッチャーでキューに入れることができます -

Application.Current.Dispatcher.BeginInvoke(
                    DispatcherPriority.Normal,
                    new Action(
                        delegate()
                        {
                            Console.WriteLine("Inside invoke?!");
                        }
                    )
                );
于 2012-06-24T15:09:01.143 に答える