SynchronizationContext context; 最近写代码用到了这个,特别记录一下。

作用如下:

    // 摘要:
// 提供在各种同步模型中传播同步上下文的基本功能。
public class SynchronizationContext
{
......
}

来自using System.Threading;这个命名空间,一看很熟悉是线程的大类命名空间。

    // 摘要:
// 获取当前线程的同步上下文。
//
// 返回结果:
// 一个 System.Threading.SynchronizationContext 对象,它表示当前同步上下文。
public static SynchronizationContext Current { get; }

我是在winform中使用,因为要线程之间同步,还有主线程绘图,之间用control.invoke,被大神鄙视,遂默默用起了大神推荐的SynchronizationContext。在Form初始化的时候context=SynchronizationContext.Current(实例化),

        //
// 摘要:
// 当在派生类中重写时,将异步消息调度到一个同步上下文。
//
// 参数:
// d:
// 要调用的 System.Threading.SendOrPostCallback 委托。
//
// state:
// 传递给委托的对象。
public virtual void Post(SendOrPostCallback d, object state);
//
// 摘要:
// 当在派生类中重写时,将一个同步消息调度到一个同步上下文。
//
// 参数:
// d:
// 要调用的 System.Threading.SendOrPostCallback 委托。
//
// state:
// 传递给委托的对象。
//
// 异常:
// System.NotSupportedException:
// 在 Windows Store 应用程序中调用的方法。用于 Windows Store 应用程序的 System.Threading.SynchronizationContext
// 的实现应用不支持 System.Threading.SynchronizationContext.Send(System.Threading.SendOrPostCallback,System.Object)
// 方法。
public virtual void Send(SendOrPostCallback d, object state);

上面的两个函数(方法)就是要用到的,一个是同步(阻塞),一个是异步(非阻塞),看自己的需要调用。其中SendOrPostCallback是一个委托,

    // 摘要:
// 表示在消息即将被调度到同步上下文时要调用的方法。
//
// 参数:
// state:
// 传递给委托的对象。
public delegate void SendOrPostCallback(object state);

使用如下(简单粗暴lambda):

            context.Send(t =>
{
//操作
}, null);
context.Post(t =>
{
//操作
}, null);

state我写一个null,是传递给那个委托的参数,可以自己选择。我是在子线程中将一个参数传递给窗体(主线程,就是我在Form得到的当前线程上下文,如果是子线程与子线程之间交流,可以在线程内调用SynchronizationContext.Current获取),然后顶一个全部的变量互相使用请求。个人感觉是很好用,很有用。不会出现句柄未创建能不良的Exception抛出。

SynchronizationContext一篇的更多相关文章

  1. TGL站长关于常见问题的回复

    问题地址: http://www.thegrouplet.com/thread-112923-1-1.html 问题: 网站配有太多的模板是否影响网站加载速度 月光答复: wp不需要删除其他的模板,不 ...

  2. 搞懂 SynchronizationContext(第一部分)【翻译】

    SynchronizationContext -MSDN 很让人失望 我不知道为什么,目前在.Net下关于这个类只有很少的资料.MSDN文档也只有很少的关于如何使用SynchronizationCon ...

  3. 搞懂 SynchronizationContext

    SynchronizationContext -MSDN 很让人失望 我不知道为什么,目前在.Net下关于这个类只有很少的资料.MSDN文档也只有很少的关于如何使用SynchronizationCon ...

  4. 进阶篇:以IL为剑,直指async/await

    接上篇:30分钟?不需要,轻松读懂IL,这篇主要从IL入手来理解async/await的工作原理. 先简单介绍下async/await,这是.net 4.5引入的语法糖,配合Task使用可以非常优雅的 ...

  5. c# winform编程之多线程ui界面资源修改总结篇【转】

    c# winform编程之多线程ui界面资源修改总结篇 单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello Wor ...

  6. 利用SynchronizationContext.Current在线程间同步上下文

    简而言之就是允许一个线程和另外一个线程进行通讯,SynchronizationContext在通讯中充当传输者的角色.另外这里有个地方需要清楚的,不是每个线程都附加SynchronizationCon ...

  7. SynchronizationContext.Post方法 代替

    http://www.codeproject.com/KB/threads/SynchronizationContext.aspx看吧,不好,就将就的看下我的吧,呵呵!(没有直接翻译,不过大概的思路相 ...

  8. C#异步编程看这篇就够了

    随着.NET Core的流行,相信你现在的代码中或多或少的会用到async以及await吧!毕竟已成标配.那么我们为什么要用async以及await呢?其实这是微软团队为我们提供的一个语法糖,让我们不 ...

  9. 利用SynchronizationContext.Current在线程间同步上下文(转)

    https://blog.csdn.net/iloli/article/details/16859605 简而言之就是允许一个线程和另外一个线程进行通讯,SynchronizationContext在 ...

随机推荐

  1. 菜鸟-手把手教你把Acegi应用到实际项目中(2)

    上一篇是基于BasicProcessingFilter的基本认证,这篇我们改用AuthenticationProcessingFilter基于表单的认证方式. 1.authenticationProc ...

  2. The Ninth Hunan Collegiate Programming Contest (2013) Problem C

    Problem C Character Recognition? Write a program that recognizes characters. Don't worry, because yo ...

  3. unique踢出相同元素

    unique函数的功能是:去除相邻的重复元素(只保留一个). 函数参数:unique(first,last,compare); //first为容器的首迭代器,last为容器的末迭代器,compare ...

  4. DFS与BFS

    顾名思义,DFS就是一直在一个方向搜索,当这一方向不可以时退回该点,换下一方向: 而BFS一开始就是向四面八方搜索,把符合条件的点存入队列中,当前一个点都搜索完毕时,再从队列顶中取出点,再向四面八方搜 ...

  5. svn提交自动同步到web目录

    环境:CentOS6.5  测试线   svn和web服务器在同一台机器上   SVN版本1.6 情景:在测试环境下,开发部提出希望提交到SVN的代码能自动同步到WEB站点目录下,解决每次都要传双份这 ...

  6. Botposter.com集群ETCD2.3.7升级至3.0实录[原创]

    7月1日,为庆祝我党生日,ETCD隆重发布了3.0版本.Botposter.com也在第一时间对集群进行了升级.本文是升级过程的记录与总结(文中假设读者已经使用或测试过ETCD V2,如有不妥请见谅) ...

  7. 【测试】自行建表并演示append+nologging,并描述数据写入后产生的效果

    ①创建表: SQL> create table t4 as select * from all_objects; Table created. ②设置t4处于nologging: SQL> ...

  8. CA提供的身份认证配置弃用

    场景:从CA网站登录,在CA主页点击我们集成到CA的业务系统图标进行跳转,发现业务系统登录过身份(没cookies),身份认证自动使用 url,跳转到CA登录页,造成二次登录 [Authorize] ...

  9. MySQL的体系结构

    因为MySQL采用的是客户机/服务器体系结构,所以你在使用MySQL存取数据时,必须至少使用两个或者说两类程序: 一个位于存放您的数据的主机上的程序 ----数据库服务器.数据库服务器监听从网络上传过 ...

  10. yii中的若干问题

    一直觉得”程序猿“是个很细致的工作,就像绣花一样,一不小心缝错一针,就可能是个很大的bug,但是为什么平时看起来大而化之的男同胞们确能在这方面如此care呢?? 以下进入正文,省去华丽丽的词语,这里仅 ...