0

私は次のようなコードを持っています:

   public override void Touch()
   {
        if ( System.Windows.Threading.Dispatcher.CurrentDispatcher.CheckAccess() )
        {
            TouchBase();
        }
        else
        {
            System.Windows.Application.Current.Dispatcher.BeginInvoke(
                    System.Windows.Threading.DispatcherPriority.Send,
                    (Action) (() => TouchBase()) );
        }
    }

そして、if ブロック (else ブロックではない) でクラッシュが発生しました。これは、そこにある特定の処理をメイン スレッドで実行する必要があるためです。コール スタックは、これがメイン スレッドではなく、管理されていない IOCP スレッドであることを明確に示しています。

だから私の質問は、CheckAccess() は、アンマネージ スレッドなどから呼び出されたときに機能しませんか? 本当にそんなに壊れるの?ここで何が起こっているのか、誰もが知っています。ところで、この問題はめったに発生しないため、ログを追加するという提案はあまり役に立ちません。

4

2 に答える 2

0

正しい方法は、代わりにSystem.Windows.Application.Current.Dispatcher.CheckAccess()を呼び出すことです(これを確認するにはしばらく時間がかかります)。System.Windows.Dispatcher.CurrentDispatcher()は、設定されていない場合に新しいディスパッチャーを作成します。これは、スレッドが管理されていない場合のようです。

于 2012-11-23T04:20:45.123 に答える
0

System.Windows.Threading.Dispatcher.CurrentDispatcher は、アプリケーションのディスパッチャーが存在するスレッドではなく、現在実行中のスレッドのディスパッチャーを提供します。すべてのスレッドにはディスパッチャーがありますが、これはあなたが探しているディスパッチャーではありません。

System.Windows.Application.Current.Dispatcher は、アプリケーションのメイン ディスパッチャーです。両方の場所でそれを使用すれば、問題ないはずです。

于 2015-07-29T17:00:28.330 に答える