WPF多线程访问控件
大家知道WPF中多线程访问UI控件时会提示UI线程的数据不能直接被其他线程访问或者修改,该怎样来做呢?
分下面两种情况
1.WinForm程序
1)第一种方法,使用委托:
private delegate void SetTextCallback(string text);
private void SetText(string text)
{
// InvokeRequired需要比较调用线程ID和创建线程ID
// 如果它们不相同则返回true
if (this.txt_Name.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.txt_Name.Text = text;
}
}
2)第二种方法,使用匿名委托
private void SetText(Object obj)
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate
{
this.txt_Name.Text = obj;
}));
}
else
{
this.txt_Name.Text = obj;
}
}
这里说一下BeginInvoke和Invoke和区别:BeginInvoke会立即返回,Invoke会等执行完后再返回。
2.WPF程序
1)可以使用Dispatcher线程模型来修改
如果是窗体本身可使用类似如下的代码:
this.lblState.Dispatcher.Invoke(new Action(delegate
{
this.lblState.Content = "状态:" + this._statusText;
}));
那么假如是在一个公共类中弹出一个窗口、播放声音等呢?这里我们可以使用:System.Windows.Application.Current.Dispatcher,如下所示
System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
{
if (path.EndsWith(".mp3") || path.EndsWith(".wma") || path.EndsWith(".wav"))
{
_player.Open(new Uri(path));
_player.Play();
}
}));
WPF多线程访问控件的更多相关文章
- WinformWPF 多线程访问控件【转】
		大家知道WPF中多线程访问UI控件时会提示UI线程的数据不能直接被其他线程访问或者修改,该怎样来做呢? 分下面两种情况 1.WinForm程序 )第一种方法,使用委托: private delegat ... 
- C#线程中安全访问控件(重用委托,避免繁复的delegate,Invoke)总结
		1.第一种,不安全,当线程过多后,timer控件和线程中同时访问窗体控件时,有时会出现界面重绘出错. public frmMain() { InitializeComponent(); System. ... 
- 深入理解MVC          C#+HtmlAgilityPack+Dapper走一波爬虫    StackExchange.Redis 二次封装   C# WPF 用MediaElement控件实现视频循环播放    net 异步与同步
		深入理解MVC MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ... 
- [C#] Control.Invoke方法和跨线程访问控件(转载)
		转载前,在网上找了好多INVOKE方法的文章,就这个看着还可以,明白了大概,以后再深用的时候再研究 ,废话少说上转载(连转载都说的这么有气势,哈哈) 在设计界面时,我们经常需要将一些需要时间才能完 ... 
- 简单介绍.Net3.0 中跨线程访问控件
		这两天用WPF做一个项目的UI部分时,发现跨线程地访问了UI控件,自然地报异常了.当时找了半天也没在控件中找到InvokeRequired属性和Invoke方法,郁闷之极.....最后发现在.net3 ... 
- C#中跨线程访问控件问题解决方案
		net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,推荐的解决方法是采用代理,用代理方法来间接操作不是同一线程创建的控件. 第二种方法是禁止编译器对跨线程访问作检查,可以实现访问,但是出不出 ... 
- C# winform编程中多线程操作控件方法
		private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ... 
- [C#] Control.Invoke方法和跨线程访问控件
		在设计界面时,我们经常需要将一些需要时间才能完成的操作放在另一个线程(不同于UI主线程)中执行.但是这些操作可能需要将其结果或完成情况通知主线程,比如调用窗体的方法,或者触发事件(由界面响应事件),很 ... 
- WPF中窗口控件的跨线程调用
		在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可. 在WPF中要麻烦一下,同样的不允许跨线程访问,因为没 ... 
随机推荐
- jdbc第二天
			事务 l 连接池 l ThreadLocal l BaseServlet自定义Servlet父类(只要求会用,不要求会写) l DBUtils à commons-dbutils 事务 l 事务的四大 ... 
- 科学计算法帮助类MathUtils
			import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; /** * 科学计算 ... 
- centos7 开启ftp服务
			1.关闭默认防火墙 systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewa ... 
- Linux下安装load generator步骤及问题解决
			Linux下安装load generator步骤及问题解决 上一篇 / 下一篇 2014-08-06 18:33:00 / 个人分类:loadrunner相关 查看( 146 ) / 评论( 0 ) ... 
- jquery api  常见 事件操作
			change.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html ... 
- 用zd1211+Ubuntu 10.04实现的AP
			[日期:2010-06-24] zd1211 在Ubuntu 10.04 LTS上的master mode 的问题解决之后,理论上就可以把zd1211 USB网卡用来做一个AP了,实际上还有几个问 ... 
- 【LeetCode】52. N-Queens II
			N-Queens II Follow up for N-Queens problem. Now, instead outputting board configurations, return the ... 
- Extending and Embedding PHP
			Extending and Embedding PHP http://wizardmin.com/2010/08/extending-and-embedding-php-6/ 
- sqlserver中将varchar类型转换为int型再进行排序的方法
			sql中把varchar类型转换为int型然后进行排序,如果我们数据库的ID设置为varchar型的 在查询的时候order by id的话 如果我们数据库的ID设置为varchar型的 在查询的时候 ... 
- OAF_OAF控件系列2 - LOV的实现(案例)
			2014-06-02 Created By BaoXinjian 
