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 为空,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.SynchronizationContextnull或基SynchronizationContext类的实例时才创建。

BeginInvokeandInvoke方法不使用SynchronizationContext. 相反,他们沿着控件的祖先查找第一个具有有效窗口句柄的控件,将委托添加到私有队列,并将私有消息发布到窗口。该WndProc例程在正确的线程上接收此消息并调用排队的委托。

于 2013-02-13T13:02:09.813 回答