C# SynchronizationContext (子线程修改UI主线程简单例子)
2015-06-07 15:58
357 查看
其实有更简便的方法。。。
在编写桌面程序需要使用多线程时,如果在工作线程里需要更新界面上的东西,因为Windows编程的特性,需要将这个工作放在界面所在的线程来执行。在1.*里,需要使用控件的BeginInvoke和判断控件的InvokeRequired属性来实现。可以参考Chris Sells在MSDN上的文章,
Safe, Simple Multithreading in Windows Forms, Part 2
http://msdn2.microsoft.com/en-us/library/ms951109.aspx
.NET 2.0 引进了System.Threading.SynchronizationContext类,
http://msdn2.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx
这个类 “Provides the basic functionality for propagating a synchronization context in various synchronization models.”
用这个类可以简化要写的编码。譬如,如果有个按钮,点击后启动一个线程,来设置主窗口的背景颜色,如果这么做
static void Button_Clicked(Object sender, RoutedEventArgs e)
{
Thread t = new Thread(RunWorkerThread);
t.Start();
}
static void RunWorkerThread(Object o)
{
SetBackground(null);
}
static void SetBackground(Object o)
{
mainWindow.Background = Brushes.Red;
}
会出错。但如果这么做,
static void Button_Clicked(Object sender, RoutedEventArgs e)
{
Thread t = new Thread(RunWorkerThread);
t.Start(SynchronizationContext.Current);//传入当前的同步上下文
}
static void RunWorkerThread(Object o)
{
//使用传入的上下文把消息发送到原来的线程上去
SynchronizationContext sc = o as SynchronizationContext;
sc.Post(SetBackground,null);
}
static void SetBackground(Object o)
{
mainWindow.Background = Brushes.Red;
}
就工作了。
在编写桌面程序需要使用多线程时,如果在工作线程里需要更新界面上的东西,因为Windows编程的特性,需要将这个工作放在界面所在的线程来执行。在1.*里,需要使用控件的BeginInvoke和判断控件的InvokeRequired属性来实现。可以参考Chris Sells在MSDN上的文章,
Safe, Simple Multithreading in Windows Forms, Part 2
http://msdn2.microsoft.com/en-us/library/ms951109.aspx
.NET 2.0 引进了System.Threading.SynchronizationContext类,
http://msdn2.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx
这个类 “Provides the basic functionality for propagating a synchronization context in various synchronization models.”
用这个类可以简化要写的编码。譬如,如果有个按钮,点击后启动一个线程,来设置主窗口的背景颜色,如果这么做
static void Button_Clicked(Object sender, RoutedEventArgs e)
{
Thread t = new Thread(RunWorkerThread);
t.Start();
}
static void RunWorkerThread(Object o)
{
SetBackground(null);
}
static void SetBackground(Object o)
{
mainWindow.Background = Brushes.Red;
}
会出错。但如果这么做,
static void Button_Clicked(Object sender, RoutedEventArgs e)
{
Thread t = new Thread(RunWorkerThread);
t.Start(SynchronizationContext.Current);//传入当前的同步上下文
}
static void RunWorkerThread(Object o)
{
//使用传入的上下文把消息发送到原来的线程上去
SynchronizationContext sc = o as SynchronizationContext;
sc.Post(SetBackground,null);
}
static void SetBackground(Object o)
{
mainWindow.Background = Brushes.Red;
}
就工作了。
相关文章推荐
- iOS开发UI高级—03Date Picker和UITool Bar控件简单介绍
- iOS开发UI高级—04多控制器和导航控制器简单介绍
- Win10预览版Build 10135原版64位英文ISO系统镜像下载地址
- HDU 1159 Common Subsequence--DP--(最长公共子序列)
- Arduino学习笔记之 Arduino的串口输出
- WPF案例 (六) 动态切换UI布局
- 《设计模式》第三章——Builder模式
- 在codeblocks里面出现converting to execution character set illegal sequence的问题
- ios-UIDatePicker
- UISearchDisplayController 简单用法
- arduino用串口控制LGB
- iOS UILocalizedIndexedCollation
- JUNIT(suite组合测试)
- NYOJ1100WAJUEJI which home strong!(bfs+优先队列)
- grunt 构建工具(build tool)初体验
- [镜像制作]VMWare搭建Openstack——guestfish命令修改虚拟机镜像
- UISprite扩展强化,减少游戏包大小功能及功能扩展【NGUI】
- UITextView默认文字提示
- 【leetcode】Distinct Subsequences
- iOS 蓝牙使用小结 bluetooth