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抛出。