为什么System.Windows.Forms BeginInvoke似乎在WPF中工作

时间:2013-02-13 12:46:56

标签: c#

我是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操作系统中共享相同的祖先,即User32.dll和DispatcherSynchronizationContext以及WindowsFormsSynchronizationContext在内部执行相同的操作。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您是正确的,WindowsFormsSynchronizationContext仅在当前AsyncOperationManager.SynchronizationContextnull或基本SynchronizationContext类的实例时才会创建。

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