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. iOS UIButton 设置图片文字垂直排列

    后面经过测试,如果button的文字长度变更,会导致图片位置变化,经过多次修改UIEdgeInsets的值也没有达到期望效果,最终采用集成UIButton类,重写layoutSubviews函数实现, ...

  2. DP编辑距离

    俄罗斯科学家Vladimir Levenshtein在1965年提出了编辑距离概念. 编辑距离,又称Levenshtein距离,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的三种编 ...

  3. 初探appium之环境搭建

    前段时间一直在折腾python的爬虫,想搞接口自动化.但是写了一个月,发现在我现在的这份的工作中根本接触不到接口.所以就想先放下来,先做点目前能够接触到的,也需要做的东西. 东西越来越多,人手不足.自 ...

  4. [ CodeVS冲杯之路 ] P1053

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1053/ 直接扫一遍串,把字母对应的 ascii 码直接做数组下标,交给数组统计 最后查询一遍数组的 'a'-'z' , ...

  5. java springMVC生成二维码

    Zxing是Google提供的工具,提供了二维码的生成与解析的方法,现在使用Java利用Zxing生成二维码 1),二维码的生成 将Zxing-core.jar 包加入到classpath下. 我的下 ...

  6. socket学习笔记——实现收发文件(Windows)

    记录下来,供自己学习! server.c #define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> #include <stdlib.h ...

  7. 应用OpenCV进行OCR字符识别

    opencv自带一个字符识别的例子,它的重点不是OCR字符识别,而主要是演示机器学习的应用.它应用的是UCI提供的字符数据(特征数据). DAMILES在网上发布了一个应用OpenCV进行OCR的例子 ...

  8. dell n2000 组播抑制

    http://en.community.dell.com/support-forums/network-switches/f/866/t/19677497 http://en.community.de ...

  9. MySQL初夜(乱码问题,命令行客户端使用)

    一.乱码问题 装好MySQL,并且将数据从SQLServer导入到MySQL之后,程序一直报错. 解决方案: 首先,输入命令: show variables like "character_ ...

  10. css自定义字体完美解决方案example

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...