繁体   English   中英

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

[英]Why does System.Windows.Forms BeginInvoke seem to work in WPF

我是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在内部执行相同的操作。

任何帮助将不胜感激。

您是正确的,只有在当前AsyncOperationManager.SynchronizationContextnull或基SynchronizationContext类的实例的情况下,才创建WindowsFormsSynchronizationContext

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM