SynchronizationContext应用
这个类的应用,官方的说明并不是很多,主要原因是因为微软又出了一些基于SynchronizationContext的类。比如:BackgroundWorker
大家写程序时经常碰到子线程调用UI线程的方法来更新UI。这个时候大家会用到如下办法
private void HandleSomeEvent(object sender, EventArgs e)
{
if(InvokeRequired)
{
BeginInvoke(new EventHandler(HandleSomeEvent), sender, e);
}
else
{
// Event logic here.
}
}
但是在我们用到BackgroundWorker的时候,却发现根本不需要再去验证InvokeRequired了,如下代码:
private void AsyncWork_Initialize()
{
worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler(AsyncWorkDoing);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(AsyncWorkDone);
} private void AsyncWorkDone(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
else if (e.Cancelled)
{
MessageBox.Show("数据初始化被取消");
}
else
{
Object result = e.Result;
// Event logic here.
}
}
这因为BackgroundWorker就是用SynchronizationContext的Post方法来回调UI线程的方法的。
这里只是让大家简单了解下SynchronizationContext,至于如何更加灵活的应用它,还需要大家的集思广益。
另外要注意的是:UI线程的SynchronizationContext实际实现类是WindowsFormSynchronizationContext,它重写POST和SEND方法。
SynchronizationContext应用的更多相关文章
- 线程处理模型 由于 SynchronizationContext 引起的死锁问题解决
由于GUI 应用程序 不能使用线程池的线程更新UI,只能使用 GUI 线程更新,所以在 await 前后需要保证是同一个 GUI 线程 ASP.NET 程序 的线程处理客户端请求的时候,需要假定客户端 ...
- 搞懂 SynchronizationContext(第一部分)【翻译】
SynchronizationContext -MSDN 很让人失望 我不知道为什么,目前在.Net下关于这个类只有很少的资料.MSDN文档也只有很少的关于如何使用SynchronizationCon ...
- 搞懂 SynchronizationContext
SynchronizationContext -MSDN 很让人失望 我不知道为什么,目前在.Net下关于这个类只有很少的资料.MSDN文档也只有很少的关于如何使用SynchronizationCon ...
- 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationContext, CoreDispatcher, ThreadLocal, ThreadStaticAttribute
[源码下载] 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationCont ...
- 【C#】【Thread】SynchronizationContext线程间同步
SynchronizationContext在通讯中充当传输者的角色,实现功能就是一个线程和另外一个线程的通讯. 需要注意的是,不是每个线程都附加SynchronizationContext这个对象, ...
- SynchronizationContext的研究之一(非WPF及Forms)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- SynchronizationContext一篇
SynchronizationContext context; 最近写代码用到了这个,特别记录一下. 作用如下: // 摘要: // 提供在各种同步模型中传播同步上下文的基本功能. public cl ...
- 译文: async/await SynchronizationContext 上下文问题
async / await 使异步代码更容易写,因为它隐藏了很多细节. 许多这些细节都捕获在 SynchronizationContext 中,这些可能会改变异步代码的行为完全由于你执行你的代码的环境 ...
- 理解SynchronizationContext,如何在Winform里面跨线程访问UI控件
SynchronizationContext 类是一个基类,可提供不带同步的自由线程上下文. 此类实现的同步模型的目的是使公共语言运行库内部的异步/同步操作能够针对不同的异步模型采取正确的行为.此模型 ...
- 【.NET异步编程系列2】掌控SynchronizationContext避免deadlock
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/async异步编程语法糖简化了异步编程方式. 相信很多开发者都看到如下异步编程实践原 ...
随机推荐
- python一个简单的web服务器和客户端
服务器: 当客户联系时创建一个连接套接字 从这个连接接收HTTP请求(*) 解释该请求所请求的特定文件 从服务器的文件系统获取该文件 并发送文件内容 ...
- nginx相关关键词
nginx在unix系统中会以daemon(守护进程)方式在后台运行; nginx默认模式是多线程的; nginx会有一个master进程和多个worker进程,master进程主要用来管理worke ...
- MVC FileDownLoad
public ActionResult MatDownload() { string ShopId = Session["ShopId"].ToString(); var self ...
- java.sql.SQLException: 无法转换为内部表示
1. 我出这个错代码:wfef.setRow_num(rs.getInt(rs.getInt(12))); 2. 分析:rs.getInt(12) 得到的是int类型,rs.getInt(rs.ge ...
- 6kzz整合ueditor
用过6kzz免费版的朋友都知道,它的后台编辑器是kindeditor,并且是两三年前的版本,有很多功能都没有,现在的kindeditor也不错,但感觉还是没有百度的ueditor强大(据说微信后台的编 ...
- Python if-elif-else
alien_color = ['green','yellow','red']for color in alien_color: if color == 'green': print 'alien_co ...
- Ehcache/Redis/Tair缓存性能对比[转载]
FW : http://xulingbo.net/?p=434 版权归许令波所有.此处只是一个转载. 后面介绍的不同方式都有测试数据,这些测试数据都是在同一的测试环境下得出的测试结果: 测试机器的配置 ...
- Vue.js:起步
ylbtech-Vue.js:起步 1.返回顶部 1. Vue.js 起步 每个 Vue 应用都需要通过实例化 Vue 来实现. 语法格式如下: var vm = new Vue({ // 选项 }) ...
- composer 发布自己的开源软件
首先创建一个github项目. 在项目中,创建一个composer.json文件. { "name": "jiqing9006/valid", "de ...
- jgrid相关功能用法记录
1.获取行号var ids = $gridList.jqGrid('getGridParam', 'selarrrow'); //多选,返回选中行号组字符 var ids2 = $gridList.j ...