WPF线程

摘要:
跨线程调用控件WPF应用程序都至少有两个线程,一个用于UI绘制,其隐藏于后台,另一个用于管理UI。WPF中UI元素只能由创建该元素的线程来访问。Dispatcher类来负责线程的组织和维护。通用的解决方法是使用提供的Dispatcher.Invoke方法来调用一个Delegate,从而安全地跨线程调用。CodeInvoke;或者CodeInvoke;跨线程发布事件当主线程调用了辅助线程中类的事件时,辅助线程可以将事件发布到主线程。

跨线程调用控件

WPF应用程序都至少有两个线程,一个用于UI绘制,其隐藏于后台,另一个用于管理UI。WPFUI元素只能由创建该元素的线程来访问。Dispatcher类来负责线程的组织和维护。通用的解决方法是使用提供的Dispatcher.Invoke方法来调用一个Delegate,从而安全地跨线程调用。(在winform中,是Control.Invoke)。

如下:

WPF线程第1张WPF线程第2张Code
publicdelegatevoidthreadcall();
publicvoidThread()
{
if(Dispatcher.Thread!=Thread.CurrentThread)
{
Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
newthreadcall(CallMainThread)));
}
else
{
CallMainThread();
}
}
voidCallMainThread()
{
textblock.text
="hello";
}

但是这样的缺点是要不得不为每个调用编写一个Invoke,还要额外声明一个委托类型。为了减少代码,可以采用匿名函数来写。

WPF线程第3张WPF线程第4张Code
Invoke(new(MethodInvoker)delegate{Text="Hello";});

或者

WPF线程第3张WPF线程第4张Code
Invoke(new(Threadstart)delegate{Text="Hello";});

跨线程发布事件

当主线程调用了辅助线程中类的事件时,辅助线程可以将事件发布到主线程。可以采用ThreadStart委托。ThreadStart委托表示在Thread上执行的方法,语法如下:

public delegate void ThreadStart()
我们可以采用默认的Threadstart委托在其他线程(如主线程)上执行事件触发的操作。如:

WPF线程第7张WPF线程第8张Code
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal,(ThreadStart)delegate(){DataDispatch();});

private void DataDispatch()
{
FireEvent();
}

说明:

对于Thread.ctor()来说,接受的是一个ThreadStart委托,编译器便可以将匿名函数与ThreadStart委托类型匹配,最后能够正确编译。

对于Control.Invoke()来说,任何的代理类型都是可以接受,也就是说ThreadStart和MethodInvoker都是可以接受的类型。所以就需要显示指定委托的类型,否则编译器无法直到匹配的匿名函数,导致了编译错误的发生。

WPF线程:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/83dfa9ec-2a2b-41b4-9e7f-b94c063fb7a0/

http://www.cnblogs.com/seandlut/archive/2008/12/08/1349949.html

http://www.cnblogs.com/Nullnoid/archive/2008/08/03/1259012.html

http://www.cnblogs.com/zhouyinhui/archive/2008/01/27/1055261.html

免责声明:文章转载自《WPF线程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android与Libgdx入门实例spring ---JdbcTemplate下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在Qt中使用sleep

  关于sleep函数,我们先来看一下他的作用:sleep函数是使调用sleep函数的线程休眠,线程主动放弃时间片。当经过指定的时间间隔后,再启动线程,继续执行代码。sleep函数并不能起到定时的作用,主要作用是延时。在一些多线程中可能会看到sleep(0);其主要目的是让出时间片。sleep函数的精度非常低,当系统越繁忙的时候它精度也就越低,有时候我们...

C++面试

https://blog.csdn.net/weixin_44363885/article/details/99567746 这一行是个 贼鸡巴重要的链接!!!   很好的总结 我直接复制到下面了: 社招:社招的同学,无论是1-3年经验,还是中途转行,都可参考。写简历必须有针对性,以后台开发为例,请去拉勾网 / 猎聘 / 智联招聘等网站,多看看后台开发的J...

【WPF学习】第四十九章 基本动画

  在前一章已经学习过WPF动画的第一条规则——每个动画依赖于一个依赖项属性。然而,还有另一个限制。为了实现属性的动态化(换句话说,使用基于时间的方式改变属性的值),需要有支持相应数据类型的动画类。例如,Button.Width属性使用双精度数据类型。为实现属性的动态化,需要使用DoubleAnimation类。但Button.Paddin属性使用的是Th...

HBase源码分析之WAL

WAL(Write-Ahead Logging)是数据库系统中保障原子性和持久性的技术,通过使用WAL可以将数据的随机写入变为顺序写入,可以提高数据写入的性能。在hbase中写入数据时,会将数据写入内存同时写wal日志,为防止日志丢失,日志是写在hdfs上的。 默认是每个RegionServer有1个WAL,在HBase1.0开始支持多个WALHBASE-...

java虚拟机启动参数分类详解

java启动参数共分为三类;其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用; 标准参数(-) verbose ...

响应式编程系列(一):什么是响应式编程?reactor入门

响应式编程 系列文章目录 (一)什么是响应式编程?reactor入门 (二)Flux入门学习:流的概念,特性和基本操作 (三)Flux深入学习:流的高级特性和进阶用法 (四)reactor-core响应式api如何测试和调试? (五)Spring reactive: Spring WebFlux的使用 (六)Spring reactive: webClie...