首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WPF中Dispatcher的初步探讨

今天要专门讲一下Dispatcher,原因是WPF中经常碰到多线程下软件界面控件的更新问题。...相信很多初步接触WPF的界面开发的朋友,为了保持界面不卡,在一个自己创建的线程中去更新或者读取一个控件时都会遇到了一个很奇怪的Exception异常,显示如下: ?...这个问题我个人认为估计99.9%的人都碰到过。因此,很多人觉得微软的WPF真不好用,就简单更新下界面咋就这么费劲,那怕仅仅是读取下TexBox的Text属性就立马崩溃。...this.Dispatcher.Invoke()就解决了异常问题,问题解决了,解决的办法是完全正确无误的,但总感觉硌得慌,干嘛这么费劲?...由此,我们应当树立一个观点: 同一个类下的方法根据你调用的方式不同,并不一定都运行于同一个线程下。即使调用其他类的函数,也可能存在两种情况,要么运行在一个线程里,要么运行在不同的线程里。

70610

WPF 的 Application.Current.Dispatcher 中,Dispatcher 属性一定不会为 null

在 WPF 程序中,可能会存在 Application.Current.Dispatcher.Xxx 这样的代码让一部分逻辑回到主 UI 线程。...WPF 的 Application.Current.Dispatcher 中,Dispatcher 属性一定不会为 null WPF 的 Application.Current.Dispatcher 中...在整个 WPF 的代码中,使用此方法的仅有以下 6 处: Freezable.Freeze 实例方法 BeginStoryboard.Seal 实例方法 Style.Seal 实例方法 TriggerBase.Seal...实例方法 StyleHelper 在 SealTemplate 静态方法中对 FrameworkTemplate 类型的实例调用此方法 ResourceDictionary 在构造函数中为 DispatcherObject...),因此 Application 类中的 Dispatcher 属性不可能因为 DetachFromDispatcher 方法的调用而被赋值为 null。

37720
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object)

    WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object) 发布于 2018-11-23...只不过,WPF 封装的大多对象和属性都调用了 VerifyAccess(例如依赖项属性),所以很大程度上限制了 WPF UI 的线程访问权限。...从这里可以推论出,你在 XAML 中写的样式,可以被跨线程访问而不会出现线程安全问题。...可以反射直接修改 _dispatcher 字段的值,改为目标线程中的 Dispatcher。这样的做法只是切换了一个线程,效果和调用 MakeSentinel 是一样的。...因为内部有 CheckAccess 和 VerifyAccess 方法检查线程的访问权限 众多子类的属性和方法在使用前调用了 VerifyAccess 来验证调用方的线程 在 XAML 中编写的代码时,

    1.1K20

    WPF 的 Application.Current.Dispatcher 中,为什么 Current 可能为 null

    在 WPF 程序中,可能会存在 Application.Current.Dispatcher.Xxx 这样的代码让一部分逻辑回到主 UI 线程。...WPF 的 Application.Current.Dispatcher 中,Dispatcher 属性一定不会为 null WPF 的 Application.Current.Dispatcher 中...在 Application 的实例构造函数中: _appInstance 的赋值是线程安全的,这意味着多个 Application 实例的构造不会因为线程安全问题导致 _appInstance 字段的状态不正确...任何与 Application 在同一个线程的代码,都不可能遇到 Application.Current 为 null。 这其实是一个线程安全问题。...,请参见我的另一篇博客: WPF 的 Application.Current.Dispatcher 中,Dispatcher 属性一定不会为 null - walterlv ---- 参考资料 Application.cs

    60630

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

    在上一篇文章 深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分) 中我们发现 Dispatcher.Invoke 方法内部是靠 Dispatcher.PushFrame...如果说上一篇文章 深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分) 中的 Invoke 算是偏冷门的写法,那 ShowDialog 总该写过吧?...——调用 Dispatcher.PushFrame 可以在不阻塞 UI 线程的情况下等待。...于是,我们每触摸一次,调用堆栈中会多出两个 PushFrame。 每次 PushFrame 之后,都会经历一次托管到本机和本机到托管的转换,随后是消息处理。我们的触摸消息就是从消息处理中调用而来。...如果希望更详细地了解 WPF 中的 Dispatcher 对消息循环的处理,可以参考:详解WPF线程模型和Dispatcher - 踏雪无痕 - CSDN博客。

    1.8K20

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

    其实微软在 .NET Framework 4.5 中已经把 BeginInvoke 的实现改造成了 TAP 异步模式,但方法名字和老旧的参数列表却始终是微软的一块心病,于是痛下决心新增了 6 个更加现代的方法免得产生兼容性问题...为什么凭空出现了一个可以用来发送消息的窗口?于是,在 Dispatcher 构造函数中发现了这个窗口。...: 关掉这个隐藏窗口; 处理 Dispatcher 调度的任务(这个消息是在 Dispatcher 的静态构造函数中注册的); 定时器。...继续调查,我们发现微软在 Dispatcher 中把所有不同种类的优先级分成了三个大类: 前台优先级(对应 DispatcherPriority.Loaded 到 DispatcherPriority.Send...如果是另一个线程调用到此线程的 Invoke,那么同步等待一下当然不会有问题。但是如果调用线程就是此线程本身呢?

    3.8K21

    WPF 使用 Dispatcher 的 InvokeAsync 和 BeginInvoke 的异常处理差别

    一般认为 WPF 的 Dispatcher 的 InvokeAsync 方法是 BeginInvoke 方法的平替方法和升级版,接近在任何情况下都应该在业务层使用 InvokeAsync 方法代替 BeginInvoke...在 BeginInvoke 抛出未捕获的异常,将会进入到 Dispatcher.UnhandledException 事件里面 根据通用的 dotnet 知识可以知道,进入到 TaskScheduler.UnobservedTaskException...的异常,在 .NET Framework 4.5 之后,包含 dotnet core 和 dotnet 5 和 dotnet 6 以及更高版本,是不会导致应用程序退出进程 根据通用的 WPF 知识可以知道...事件 接下来是对此行为的测试代码 新建一个 WPF 项目,编写简单的界面,加上两个按钮,这两个按钮用来分别调用 InvokeAsync 和 BeginInvoke 抛出异常 在主线程调度的,需要使用 Dispatcher 才能让内容输出在界面 接下来编写两个按钮的代码 private void InvokeAsyncButton_OnClick

    57210

    WPF 的 Dispatcher 为什么要创建一个隐藏窗口?

    在深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分)中,我提到 Dispatcher 在构造函数中创建了一个隐藏窗口专门用来接收消息,以处理通过 Invoke...然而 C 不满足于只看到这个结论,他更期望知道为什么 WPF 一定要创建这个隐藏的窗口。其实对这个问题我也不知道答案,但在和他深入的探讨以及不断寻找资料的过程中,我们逐渐得知了缘由。...本文记录了这一次探讨,给希望了解 Windows、WPF 底层机制的人一些可供参考的思路和结论。当然,要特别感谢 C 提出了这个问题,并在讨论过程中给出了关键性的推理。...再大不了觉得这样在消息循环中耦合了 Dispatcher 内的机制的话,可以利用一下“依赖倒置”原则将这种依赖抽象一下,在解决代码可维护性的问题的同时,依然能可以避免额外创建一个窗口。...综上所述,WPF 在 Dispatcher 的机制里创建隐藏的消息窗口,其目的就是为了解决消息循环嵌套问题,只要所有实现了消息循环的开发者能记得调用 DispatchMessage 函数,Dispatcher

    30520

    在 WPF 中实现融合效果

    在之前的一篇文章中,我使用 Win2D 实现了融合效果,效果如下: 不过 Win2D 不适用于 WPF,在 WPF 中可以使用 BlurEffect 配合自定义 Effect 实现类似的效果。...自定义 Effect 在 Win2D 中,实现融合效果的步骤是先使用 GaussianBlurEffect 在两个元素间产生粘连在一起的半透明像素,再用 ColorMatrixEffect 加强对比对,...在 WPF 中我们可以直接使用自带的 BlurEffect 实现高斯模糊,效果如下: 接下来需要加强对比度。...WPF 中没有 ColorMatrixEffect 的替代品,不过我们可以使用 HLSL(高级着色器语言)编写 PixelShader 并生成自定义的 WPF Effect。...很明显,问题出在上面的代码中 Alpha 通道最终不是 0 就是 1,为了使边缘平滑,应该留下一些“中间派”。

    1.3K20

    Toast在子线程调用的问题

    Toast我们平时经常使用,但是你是否了解在子线程中要如何使用Toast呢?....show(); 但是如果在子线程调用是不会有toast弹出的 Toast的正确姿势 如果在子线程调用那么让Toast能正常显示的方式是在它之前和之后调用Looper.prepare()和Looper.loop...,而传给他的参数里的 mTn又是什么呢, 其实它是Toast的一个内部类,它有两个方法,show()和hide()是用来给NotificationManagerService回调的,可以看看它的代码 private...因此没有调用prepare()和启动消息队列的话,在子线程调用Toast是显示不出来的。...总结 Toast在主线程的显示只需要调用show()就可以,如果想在子线程调用,则需要在子线程启动Looper,这样才能有消息队列来承载Handler收发消息。否则子线程的Toast是不能显示的

    79530

    FluentValidation在C# WPF中的应用

    其实它也可以用于WPF属性验证,本文主要也是讲解该组件在WPF中的使用,FluentValidation官网是: https://fluentvalidation.net/ 。...本文需要实现的功能unsetunset 提供WPF界面输入验证,采用MVVM方式,需要以下功能: 能验证ViewModel中定义的基本数据类型属性:int\string等; 能验证ViewModel中定义的复杂属性...调研中遇到的问题unsetunset 简单属性:验证ViewModel的普通属性比较简单,可以参考FluentValidation官网 ,或者国外holymoo大神的代码: UserValidator.cs...复杂属性:我遇到的问题是,怎么验证ViewModel中对象属性的子属性?...创建验证器 验证属性的写法有两种: 可以在实体属性上方添加特性(本文不作特别说明,百度文章介绍很多); 通过代码的形式添加,如下方,创建一个验证器类,继承自AbstractValidator,在此验证器构造函数中写规则验证属性

    19110

    在Java中调用Python

    写在前面 在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢。当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单。...恰好我在项目中就遇到了这个问题,需要在Java程序中调用Python程序。...关于在Java中调用Python程序的实现,根据不同的用途可以使用多种不同的方法,在这里就将在Java中调用Python程序的方式做一个总结。...中通过Runtime调用Python程序与直接执行Python程序的效果是一样的,可以在Python中读取传递的参数,也可以在Java中读取到Python的执行结果。...使用Jython能做什么 既然Jython是Python语言在Java平台的实现,是Java语言实现的,那么是否可以在Jython程序中调用Java,在Java中也能调用Jython呢?

    5.1K30

    在Android中调用WebService

    我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互。...本文就给大家讲解在Android中如何调用远程服务器端提供的WebService。 既然是调用WebService,我们首先的搭建WebService服务器。...地址:http://www.webxml.com.cn/zh_cn/index.aspx 下面演示的就是如何通过该网站提供的手机号码归属地查询WebService服务查询号码归属地 调用地址http:/...中调用WebService还是比较简单的:请求webservice,获取服务响应的数据,解析后并显示。...,相信大家已经学习了如何在Android中调用WebService,最后运行效果: 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/109893.html原文链接:

    1.9K40

    WPF 图片显示中的保留字符问题

    在WPF中显示一张图片,本是一件再简单不过的事情。一张图片,一行XAML代码即可。...但是前段时间遇到了一件奇怪的事: 开发机上运行正常的程序,在某些客户机器上却显示不了图片,而且除了这个问题,其它运行情况都正常。开始排查问题吧,先检查代码,然后检查编译打包过程,并没有发现任何问题。...这就是今天想说的问题,某些特殊符号(或叫保留字符)对图片显示的影响。 首先简单回顾一下WPF中显示图片常用的两种图片资源存储方式:资源 和 内容。资源会被编译到exe或dll中,使用优势是速度,简便。...在WPF中,不管是资源还是内容的方式,都是通过URI (uniform resource identifier)来标识和加载文件的。...大家可以在这里对URI的构造和解析原理做更多的了解:MSDN WPF 中的 Pack URI。

    1.1K110

    在Android中调用WebService

    我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互。...本文就给大家讲解在Android中如何调用远程服务器端提供的WebService。 既然是调用WebService,我们首先的搭建WebService服务器。...地址:http://www.webxml.com.cn/zh_cn/index.aspx 下面演示的就是如何通过该网站提供的手机号码归属地查询WebService服务查询号码归属地 调用地址http:/...中调用WebService还是比较简单的:请求webservice,获取服务响应的数据,解析后并显示。...getMobileAddress(InputStream inStream, String mobile) throws Exception 76 { 77 // 替换xml文件中的电话号码

    2.3K50

    有关java中的参数调用的问题

    专业术语——     按值调用(call by value) 表示方法接受的是调用者提供的值。    ...按引用调用(call by reference) 表示方法接受的是调用者提供的变量地址。     一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。  ...java中只有值传递!     java中只有值传递!     java中只有值传递!     重要的事情要说三遍!!!  ...值的拷贝,这里是一个对象的调用。...然而,在方法结束后参数变量x和y被丢弃了。原来的变量a和b仍然引用这个方法调用之前所引用的对象。 总结: .一个方法不能修改一个基本数据类型的参数(即布尔型和数值型)。

    1.1K60

    学习WPF——了解WPF中的XAML

    XAML的简单说明 XAML是用于实例化.NET对象的标记语言,主要用于构建WPF的用户界面 XAML中的每一个元素都映射为.NET类的一个实例,例如映射为WPF的Button对象...Application 用于定义应用程序资源和启动设置 任何一个XAML文档只能拥有一个顶级元素 属性 窗口标签中Title、Height、Width都是窗口的属性 在XAML文件中属性的值的类型总是字符串...如果我们在第三方组件中定义了Window类,如果没有一个名称空间做限定的话, 编译器不知道我们将使用哪个Window类型来渲染窗口 我们在上面的代码中,看到了两个名称空间,一个是WPF核心名称空间、...类上 代码隐藏类 XAML创建用户界面,但交互规则还是需要.NET语言编写 x:Class属性标记着与该XAML文件相配合的.NET类 注意这个类是一个“部分类” 这个部分类的构造函数中调用了InitializeComponent...附加属性 对于嵌套的元素,子元素可以使用父元素定义的一些属性,这类属性就是附加属性 在WPF中附加属性多用于布局 修改记录 2015-1-5:完成全部内容 参考资料 《Pro

    2K70

    DNS在远程调用执行中的应用

    纯属蹭log4j2热度文,和安全没有直接的关系,本文只谈DNS以及日志应用; 通过dnslog.cn的截图,分析dnslog.cn的原理,基于此,介绍了可以获取更多信息的ceye的功能;在应用场景上...在自己的设备上执行,可以看到我设备本身的DNS的外网递归出口为27.40.22.150的IP地址; image.png image.png 二、实现原理 image.png     当我们在...的权威服务器就能知道,在什么时间,什么IP请求了什么域名,然后做日志回显即可完成该操作;(该网站提供的子域名TTL也是 190,所以在190s之内的请求就记录不了了,要等到下一个TTL周期进行请求。)...实现成本相对低廉,仅需一个权威服务器和http服务器即可完成;且只要可以访问互联网的终端设备均可完成覆盖;该场景除了用户问题排障方便外,可以将请求封装到应用本身,同过大量的请求来分析国内用户的网络出口同...DNS递归出口之间的关系,将用户DNS问题预先一步解决; 四、总结     综上,我们通过dnslog.cn的截图,分析了dnslog.cn的原理,基于此,介绍了可以获取更多信息的ceye的功能,在场景上

    6K240
    领券