深入了解 WPF Dispatcher 的工作原理(PushFrame 部分)

在上一篇文章 深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分) 中我们发现 Dispatcher.Invoke 方法内部是靠 Dispatcher.PushFrame 来确保“不阻塞地等待”的。然而它是怎么做到“不阻塞地等待”的呢?

阅读本文将更深入地了解 Dispatcher 的工作机制。


本文是深入了解 WPF Dispatcher 的工作原理系列文章的一部分:

  1. Invoke/InvokeAsync 部分
  2. PushFrame 部分(本文)

Dispatcher.PushFrame 是什么?

如果说上一篇文章 深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分) 中的 Invoke 算是偏冷门的写法,那 ShowDialog 总该写过吧?有没有好奇过为什么写 ShowDialog 的地方可以等新开的窗口返回之后继续执行呢?

var w = new FooWindow();
w.ShowDialog();
Debug.WriteLine(w.Bar);

看来我们这次有必要再扒开 Dispatcher.PushFrame 的源码看一看了。不过在看之前,我们先看一看 Windows Forms 里面 DoEvents 的实现,这将有助于增加我们对源码的理解。

DoEvents

Windows Forms 里面的 DoEvents 允许你在执行耗时 UI 操作的过程中插入一段 UI 的渲染过程,使得你的界面看起来并没有停止响应。

[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public void DoEvents()
{
    DispatcherFrame frame = new DispatcherFrame();
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
        new DispatcherOperationCallback(ExitFrame), frame);
    Dispatcher.PushFrame(frame);
}

public object ExitFrame(object f)
{
    ((DispatcherFrame)f).Continue = false;

    return null;
}

首先我们需要拿出本文一开始的结论——调用 Dispatcher.PushFrame 可以在不阻塞 UI 线程的情况下等待。

在此基础之上,我们仔细分析此源码的原理,发现是这样的:

    • 2
      点赞
    • 11
      收藏
      觉得还不错? 一键收藏
    • 3
      评论
    WPF(Windows Presentation Foundation)是一种用于创建Windows桌面应用程序的技术。深入浅出WPF原码可以让我们更好地理解WPF工作原理和实现机制。 在深入研究WPF原码之前,我们首先需要了解WPF的基本概念和架构。WPF基于XAML语言(可扩展应用程序标记语言),通过定义UI元素的层次结构和属性来构建界面。WPF通过使用可视树和逻辑树来描述应用程序的界面和行为。 深入WPF原码的过程中,我们可以学习到WPF的重要组件和类,例如UIElement、DependencyObject、DependencyProperty和Visual等。UIElement是WPF控件的基类,通过继承和重写UIElement类的方法,我们可以实现自定义的控件。DependencyObject是WPF中属性系统的基类,通过定义依赖属性(DependencyProperty),我们可以实现属性的绑定、动画和数据验证等功能。Visual则是WPF中用于可视化呈现的基类,WPF的可视化树就是由一系列的Visual对象组成。 深入研究WPF原码有助于我们了解WPF是如何处理事件、布局、绘图和渲染等方面的。通过阅读WPF原码,我们可以研究WPF内部实现的细节和机制,如布局系统、渲染管线、命中测试和动画系统等。这些知识对于我们在实际开发中更好地使用和优化WPF应用程序非常有价值。 总之,深入浅出WPF原码是一个学习WPF技术的重要途径,通过理解WPF的内部工作原理,我们可以更好地运用WPF创建出高效、功能强大的Windows桌面应用程序。

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论 3
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值