WPF线程(Step1)——Dispatcher】的更多相关文章

使用WPF开发时经常会遇上自己建立的线程需要更新界面UI内容,从而导致的跨线程问题. 异常内容: 异常类型:System.InvalidOperationException 异常描述: "System.InvalidOperationException"类型的未经处理的异常在 WindowsBase.dll 中发生 其他信息: 调用线程无法访问此对象,因为另一个线程拥有该对象. 在WPF中最简便的解决此问题的方法就是使用Dispatcher. 1.最便捷的使用Dispatcher th…
WPF 应用程序从两个线程开始: 一个用于处理呈现 一个用于管理 UI 呈现线程有效地隐藏在后台运行,而UI线程则接收输入.处理事件.绘制屏幕以及运行应用程序代码. 大多数应用程序都使用一个 UI 线程,但在某些情况下,最好使用多个线程.我们将在后面举例说明这一点. UI 线程对一个名为 Dispatcher 的对象内的工作项进行排队. Dispatcher基于优先级选择工作项,并运行每一个工作项,直到完成.每个UI线程都必须至少有一个Dispatcher,并且每个 Dispatcher 都只能…
原文 WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object) 众所周知的,WPF 中多数对象都继承自 DispatcherObject,而 DispatcherObject 带给这些对象一个特点:不能跨线程访问. 不过,WPF 中依然存在一些例外.本文将介绍 WPF 那些可跨线程访问的 DispatcherObject,如何充分利用这个特点提高应用程序的性能,以及如何自己编写这样的 DispatcherObject…
一.线程概述:[引用MSDN] 通常,WPF 应用程序从两个线程开始:一个用于处理呈现,一个用于管理 UI.呈现线程有效地隐藏在后台运行,而 UI 线程则接收输入.处理事件.绘制屏幕以及运行应用程序代码.大多数应用程序都使用一个 UI 线程,但在某些情况下,最好使用多个线程.我们将在后面举例说明这一点. UI 线程对一个名为 Dispatcher 的对象内的工作项进行排队.Dispatcher 基于优先级选择工作项,并运行每一个工作项,直到完成.每个 UI 线程都必须至少有一个 Dispatch…
本人文笔差.还是直接上代码吧.(本文假设你对WPF中的Dispatcher有一定的了解) 你觉得下面的代码可以正常执行吗? private void Button_Click(object sender, RoutedEventArgs e) { Thread t = new Thread(() => { while (true) { new Window().Show(); Thread.Sleep(); } }); t.Start(); } WPF的操作UI的线程必须是单线程单元模型(STA…
DispatcherObject,Dispatcher,Thread之间的关系 我们都知道WPF中的控件类都是从System.Windows.Threading.DispatcherObject继承而来, 而DispatcherObject又在构造时与当前线程的Dispatcher关联起来,CurrentDispatcher如果为null则会主动new一个Dispatcher并且在构造时和当前创建它的线程关联起来了.因此整个链为DispatcherObject <- Dispatcher <-…
原文:WPF 线程:使用调度程序构建反应速度更快的应用程序 作者:Shawn Wildermuth 原文:http://msdn.microsoft.com/msdnmag/issues/07/10/WPFThreading/default.aspx?loc=en-us本文讨论: 在 WPF 中执行线程 使用调度程序 非 UI 线程处理 使用计时器 本文使用了以下技术:.NET Framework 3.0, WIndows Presentation Foundation 目录 线程模型Dispa…
WPF中只能是UI线程才可以改变UI控件相关,当采用多线程工作时,可用以下代码获取 UI线程进行操作: App.Current.Dispatcher.Invoke((Action)delegate() { //codes }…
WPF中使用线程操作控件,按平常的操作方法操作的话会报异常:调用线程无法访问此对象,因为另一个线程拥有该对象.所以我们要使用Dispatcher类的BeginInvoke()与Invoke()方法.BeginInvoke()异步执行,不等待委托结束就更新,Invoke()同步执行,需等待委托执行完. 有一个Lable控件: <Label x:Name="test" Content="测试"></Label> 1.获取控件的值: string…
在WPF中第二个常用的线程处理方式就是BackgroundWorker. 以下是BackgroundWorker一个简单的例子. public partial class MainWindow : Window { /// <summary> /// 后台worker /// </summary> BackgroundWorker worker = new BackgroundWorker(); public MainWindow() { InitializeComponent()…
new Thread(() => { Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => { Thread.Sleep(TimeSpan.FromSeconds()); this.lblHello.Content = "欢迎你光临WPF的世界,Dispatche 异步方法!!"+ DateTime.Now.ToString(); })); }).Star…
一般我们WPF中都加全局捕获,避免出现异常导致崩溃. Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException; AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); TaskScheduler.Uno…
public static Dictionary<string, object> Dic = new Dictionary<string, object>();//定义一个字典类型的接受窗体信息 public static void AwaitAnimation(bool isStart = true) { if (isStart == true) { Thread t = new Thread(() => { Pmtoload sw = new Pmtoload(); Di…
Thread thread = new Thread(new ThreadStart(() =>        {            VisualTarget visualTarget = new VisualTarget(hostVisual);            var control = new UserControl1();            control.Arrange(new Rect(new Point(), content.RenderSize));        …
WPF 应用程序启动后,会有两个线程: 1. 一个是用来处理UI呈现(处理UI的请求,比如输入和展现等操作). 2. 一个用来管理 UI的 (对UI元素及整个UI进行管理). 像Winform一样,WPF在线程里面是不可以直接操作UI元素,如果在一个非UI线程里操作UI元素,将会报错! XAML代码如下: <Window x:Class="WpfApp1112.Window1" xmlns="http://schemas.microsoft.com/winfx/2006…
一.Dispatcher介绍 微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢? 不管是WinForm应用程序还是WPF应用程序,实际上都是一个进程,一个进程可以包含多个线程,其中有一个是主线程,其余的是子线程.在WPF或WinForm应用程序中,主线程负责接收输入.处理事件.绘制屏幕等工作,为了使主线程及时响应,防止假死,在开发过程中对一些耗时的操作.消耗资源比较多的操作,都会去创建一个或多个子线程去完成操作,比如大数据量的循环操作.后台下载.这样一来,由…
微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢?Dispatcher的作用是用于管理线程工作项队列.主线程负责接收输入.处理事件.绘制屏幕等工作,这样一来,UI界面是主线程创建的,因为子线程不能直接更新由主线程维护的UI界面,所有调用Dispatcher更新UI. 实例:WPF更新UI方式一 new Thread(()=>{ this.Dispatcher.Invoke(new Action(()=>{ //通知主线程去完成更新 })); }).Star…
在上一篇文章 深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分) 中我们发现 Dispatcher.Invoke 方法内部是靠 Dispatcher.PushFrame 来确保"不阻塞地等待"的.然而它是怎么做到"不阻塞地等待"的呢? 阅读本文将更深入地了解 Dispatcher 的工作机制. 本文是深入了解 WPF Dispatcher 的工作原理系列文章的一部分: Invoke/InvokeAsync 部分 Push…
微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢?Dispatcher的作用是用于管理线程工作项队列.主线程负责接收输入.处理事件.绘制屏幕等工作,这样一来,UI界面是主线程创建的,因为子线程不能直接更新由主线程维护的UI界面,所有调用Dispatcher更新UI. 实例:WPF更新UI方式一new Thread(()=>{    this.Dispatcher.Invoke(new Action(()=>{        //通知主线程去完成更新    …
Disaptcher作用 不管是WinForm应用程序还是WPF应用程序,实际上都是一个进程,一个进程可以包含多个线程,其中有一个是主线程,其余的是子线程.在WPF或WinForm应用程序中,主线程负责接收输入.处理事件.绘制屏幕等工作,为了使主线程及时响应,防止假死,在开发过程中对一些耗时的操作.消耗资源比较多的操作,都会去创建一个或多个子线程去完成操作,比如大数据量的循环操作.后台下载.这样一来,由于UI界面是主线程创建的,所以子线程不能直接更新由主线程维护的UI界面. Dispatcher…
WPF线程获取UI线程   WPF中只能是UI线程才可以改变UI控件相关,当采用多线程工作时,可用以下代码获取 UI线程进行操作: App.Current.Dispatcher.Invoke((Action)delegate() { //codes }…
在C#中,Task.Run当然是一个很好的启动新并行任务的机制,但是因为使用这个方法时,每次新的任务都会在一个新的线程中(其实就是线程池中的线程)运行 这样会造成某些情形下现场调度的相对困难,即使我隔离出一个与UI无关的对象,然后用UI线程的Dispatcher实现对UI线程的交互,但是用Task启动的多个任务线程却难以管理,而且.net Core UWP已经不再提供具体线程调度的管理了 最终我写了个这个玩意 class NoUIDispatcher:IDisposable { #if DEBU…
 <Window x:Class="DispatcherExam.MainWindow"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"         Title="MainWindow" H…
在.NET中,我们使用try-catch-finally来处理异常.但,当一个Exception抛出,抛出Exception的代码又没有被try包围时,程序就崩溃了. 这些异常往往是你没有注意到的.在WPF中,提供了一种处理这些个异常的方式. 举例来说明. 1.先抛出个异常,不用try包围它. 在MainWindow上添加一个如下的Button. <Window x:Class="HandlingAnUnhandledException.MainWindow" xmlns=&qu…
Winform中的控件是绑定到特定的线程的(一般是主线程),这意味着从另一个线程更新主线程的控件不能直接调用该控件的成员. 控件绑定到特定的线程这个概念如下: 为了从另一个线程更新主线程的Windows Form控件,可用的方法有: 首先用一个简单的程序来示例,这个程序的功能是:在Winfrom窗体上,通过多线程用label显示时间.给出下面的两种实现方式 1.结合使用特定控件的如下成员 InvokeRequired属性:返回一个bool值,指示调用者在不同的线程上调用控件时是否必须使用Invo…
前言 谈起“消息机制”这个词,我们都会想到Windows的消息机制,系统将键盘鼠标的行为包装成一个Windows Message,然后系统主动将这些Windows Message派发给特定的窗口,实际上消息是被Post到特定窗口所在线程的消息队列,应用程序的消息循环再不断的从消息队列当中获取消息,然后再派发给特定窗口类的窗口过程来处理,在窗口过程中完成一次用户交互. 其实,WPF的底层也是基于Win32的消息系统,那么对于WPF应用程序来说,它是如何跟Win32的消息交互,这里到底存在一个什么样…
对于 WPF 的线程模型,Dispatcher 对象相信各位大伙伴已经不陌生,尤其是跨线程更新UI的时候,都会用它来调度消息.与 Dispatcher 对象有关的,还有一个叫 DispatcherFrame 的东东,开发文档是这么说的:Represents an execution loop in the Dispatcher,这样描述肯定是让人看不明白的,老周也不明白. 那咋办呢?根据老周十几年来积累下来的一些不要脸的经验,遇到这些很是抽象的玩意儿,可以有两种途径去了解:1.看.net 源代码…
目录 WPF的消息机制(一)-让应用程序动起来 WPF的消息机制(二)-WPF内部的5个窗口 (1)隐藏消息窗口 (2)处理激活和关闭的消息的窗口和系统资源通知窗口 (3)用于用户交互的可见窗口 (4)用于UI窗口绘制的可见窗口 WPF的消息机制(三)-WPF输入事件的来源 WPF的消息机制(四)-WPF中UI的更新 WPF内部的5个窗口 对于Windows系统来说,它是一个消息系统,消息系统的核心就是窗口.对于WPF来说也是如此.那么WPF内部为什么需要窗口,又存在哪些窗口呢? 在上一篇,我们…
概要 在我使用了半年多 WPF 后,是时候写点关于 WPF 基础方面的东西了.我发表了一系列针对具体问题的文章.现在是到了让大家明白为什么说WPF是一款在界面开发上带来革命的产品了. 本文针对初级-中级程序员,所以我尽量给出一些基础的示例. WPF 介绍 就像名字表示的那样(WPF:Windows Presentation Foundation 直译为 Windows 图像基础),WPF是在 .NET Framework 3.0 引进的一个新框架,包含了很多可以更快速和方便地编写程序的类库.它使…
DispatcherObject是根基类,通过继承该类,可以得到访问创建该对象的UI线程的Dispatcher对象的能力.通过Dispatcher对象,可以将代码段合并入该UI线程执行. DependencyObject是核心基类,用于实现依赖属性机制.依赖属性是一个比CLR属性更强大的属性模型,该模型支持更改通知,默认值继承等特性,并能减少属性存储空间.DependencyObject通过GetValue和SetValue等方法支持依赖属性机制.继承该类的几个下一层基类Visual,Visua…