wpf(怎么跨线程访问wpf控件)
在编写代码时,我们经常会碰到一些子线程中处理完的信息,需要通知另一个线程(我这边处理完了,该你了)。
但是当我们通知WPF的UI线程时需要用到Dispatcher。
首先我们需要想好在UI控件上需要显示什么内容。然后写一个显示UI内容的方法。
以下是代码
- private void UIThreaddosomething(string s) //UI线程要做的事情
- {
- //do something //这里也可以做一些其他的事情
- Label2.Content = s;
- ellipse1.Fill=new SolidColorBrush(Colors.Red);
- ellipse2.Fill=new SolidColorBrush(Colors.Red);
- }
然后我们声明一个委托,由于UIThreaddosomething有一个字符串参数,所以声明的委托要与其保持一致
- public delegate void RefleshUI(string s);
然后在创建一个方法,这个方法将通过委托将子线程与UI线程联系起来。
- private void delegatedosomething(string s)
- {
- ellipse1.Dispatcher.Invoke(new RefleshUI(UIThreaddosomething), s);
- // ellipse2.Dispatcher.Invoke(new RefleshUI(UIThreaddosomething), s);
- }
这里我之前以为只要UI控件里有多少控件,就需要在此方法里用多少个Dispatcher,最后发现是我太年轻,只需要一个控件用上Dispatcher就好啦。
这里我们就可以跨线程访问WPF的UI控件了
完整代码如下,(这里我们也还可以使用一个中间方法来调用了UI方法,这样当程序有多个UI方法时,我们可以在这个中间方法中做一些处理,然后决定引用那些UI方法)
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Shapes;
- using System.Threading;
- namespace 子线程通知主线程做一些事情
- {
- /// <summary>
- /// MainWindow.xaml 的交互逻辑
- /// </summary>
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- }
- public delegate void RefleshUI(string s);
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- Thread th;
- th = new Thread(fun);
- th.IsBackground = true;
- th.Start();
- }
- private void fun(object obj)
- {
- //////做一些子线程该做的事情
- /////
- /////
- /**子线程完成后通知UI线程*/
- delegatedosomething("你好,我是jjp_god,我做完了");
- }
- private void delegatedosomething(string s)
- {
- ellipse1.Dispatcher.Invoke(new RefleshUI(dofun), s);
- // ellipse2.Dispatcher.Invoke(new RefleshUI(UIThreaddosomething), s);
- }
- private void UIThreaddosomething(string s) //UI线程要做的事情
- {
- //do something //这里也可以做一些其他的事情
- tb_show.Text = s;
- Label2.Content = s;
- ellipse1.Fill=new SolidColorBrush(Colors.Red);
- ellipse2.Fill=new SolidColorBrush(Colors.Red);
- }
- private void dofun(string s)
- {
- UIThreaddosomething(s);
- }
- }
}
wpf(怎么跨线程访问wpf控件)的更多相关文章
- 跨线程访问UI控件时的Lambda表达式
工作中经常会用到跨线程访问UI控件的情况,由于.net本身机制,是不允许在非UI线程访问UI控件的,实际上跨线程访问UI控件还是 将访问UI的操作交给UI线程来处理的, 利用Control.Invok ...
- 理解SynchronizationContext,如何在Winform里面跨线程访问UI控件
SynchronizationContext 类是一个基类,可提供不带同步的自由线程上下文. 此类实现的同步模型的目的是使公共语言运行库内部的异步/同步操作能够针对不同的异步模型采取正确的行为.此模型 ...
- WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )
WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...
- 实现 winform 异步跨线程访问UI控件
在开发winform时经常会用到多线程防止界面出现假死现象,比如当你单击某个按钮时,需要执行很多代码,但是在执行过程中想实时的将当前执行的情况报告给用户,类型进度条或文本什么的. 这个时候很显然,如果 ...
- 实现跨线程访问UI控件的3种方法
namespace 多线程 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } privat ...
- Visual studio之C#跨线程调用UI控件
背景 当前串口通讯项目,多个线程需要同时利用richTextBoxMsg控件打印信息,直接调用会造成线程不安全,严重的时候会直接导致UI线程挂掉,因此本篇就跨线程调用UI控件做个记录. 正文 定义控件 ...
- 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常
在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应 ...
- (转).NET 4.5中使用Task.Run和Parallel.For()实现的C# Winform多线程任务及跨线程更新UI控件综合实例
http://2sharings.com/2014/net-4-5-task-run-parallel-for-winform-cross-multiple-threads-update-ui-dem ...
- C# 跨线程调用form控件技巧及byte[]与string型相互转换
跨线程调用form控件技巧 private delegate void MethodSocket(object obj);//使用托管 ss = "OK"; this.BeginI ...
随机推荐
- Androdi Gradle build project info 很慢
Androdi Gradle build project info 很慢 http://blog.csdn.net/stupid56862/article/details/78345584 原创 ...
- java selenium webdriver第四讲 应用小结
部分api 1.访问网站 driver.get("http://www.baidu.com"); 或者 driver.navigate().to("http://www. ...
- uvalive 7299 Boggle
Boggle is a game in which 16 dice with letters on each side are placed into a 4 × 4 grid. Players th ...
- CentOS上安装 jdk
先下载最新的jdk版本 文件名:jdk-8u5-linux-x64.rpm 将文件通过winscp上传到/usr/local目录中 rpm -ivh jdk-8u5-linux-x64.rpm 系统会 ...
- 新手C#参数类型ref、out、params的学习2018.08.04
ref用于传递参数时,将实参传递到函数中,是引用参数,在使用前必须被赋值.string类型也同样适用. static void Main(string[] args) { string a1,a2; ...
- So you've been rejected, now what? On appeals in peer-reviewed publications(From Wiley Exchanges)
Getting rejected stinks. Wouldn’t it be great if we could appeal people’s decisions in life? Imagine ...
- code1135 选择客栈
首先,预处理三个数组. pre[x]表示在此之前颜色为x的客栈有多少个. f[x]表示在此之前的客栈中,某个点c,c的颜色为x,并且从c点到已经读入的点之间有费用小于p的客栈,这样的c点的个数 las ...
- Java Thread系列(十)生产者消费者模式
Java Thread系列(十)生产者消费者模式 生产者消费者问题(producer-consumer problem),是一个多线程同步问题的经典案例.该问题描述了两个共亨固定大小缓冲区的线程-即所 ...
- Spring MVC的handlermapping之请求分发如何找到正确的Handler(BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping)
本文讲的是Spring MVC如何找到正确的handler, 前面请求具体怎么进入到下面的方法,不再细说. 大概就是Spring mvc通过servlet拦截请求,实现doService方法,然后进入 ...
- win7下面iis错误汇总
1.分析器错误消息: 无法识别的属性“targetFramework”.请注意属性名称区分大小写 解决方法: 修改.NET Framework 版本为相应版本即可,我以前用的是2.0换成4.0的时候出 ...