0

私はWPFに少し慣れていません。WPFとそのスレッドモデルを実験している間、私はいくつかの実験を試みました。

MainWindow.xaml.csで次のコード行を実行しました。

    var sync = SynchronizationContext.Current;

//System.Windows.Threading.DispatcherSynchronizationContextを返します//

    var frm = new System.Windows.Form();
    IntPtr temp = frm.Handle;
    sync = SynchronizationContext.Current;

//同期はSystem.Windows.Threading.DispatcherSynchronizationContextです。したがって、SynchronizationContext.Currentがnullの場合、System.Windows.FormはSystem.Windows.Forms.WindowsFormsSynchronizationContextを作成すると思います。//

//ここで奇妙な部分があります。

    Thread th = new Thread(() =>
                           {
                                     Action strac = UpdateTextBox;
                                     frm.BeginInvoke(strac);
                           });
    th.Start();



    void UpdateTextBox()
    {
        textBox1.Text = "Abhik";
    }

// System.Windows.FormのBeginInvokeを使用して、リクエストをUIスレッドにマーシャリングし、UIコントロールを更新しようとしました。

機能した!!..

なぜそれが機能したのか誰かに教えてもらえますか?これは、WPFコントロールとwinformコントロールがWindows OSで同じ祖先を共有しているためです。つまり、User32.dllとDispatcherSynchronizationContextおよびWindowsFormsSynchronizationContextは内部で同じことを行います。

どんな助けでもありがたいです。

4

1 に答える 1

0

は、現在のが基本クラスのインスタンスであるWindowsFormsSynchronizationContext場合にのみ作成されるというのは正しいことです。AsyncOperationManager.SynchronizationContextnullSynchronizationContext

BeginInvokeおよびメソッドはInvokeを使用しませんSynchronizationContext。代わりに、コントロールの祖先をたどって、有効なウィンドウハンドルを持つ最初のコントロールを見つけ、デリゲートをプライベートキューに追加し、プライベートメッセージをウィンドウに投稿します。ルーチンは正しいスレッドでこのWndProcメッセージを受信し、キューに入れられたデリゲートを呼び出します。

于 2013-02-13T13:02:09.813 に答える