• 线程间通讯:SynchronizationContext


    SynchronizationContext的讲解,该博友已经是非常清楚了:

    http://www.cnblogs.com/Kevin-moon/archive/2009/01/13/1374353.html

    http://www.cnblogs.com/Kevin-moon/archive/2009/01/16/1376812.html

    在此只是做个笔记:

    一 故事背景

    先做个比喻(不知道是否恰当):

    线程A:国家A;

    线程B:国家B;

    SynchronizationContext对象A:国家A的内奸。

    故事是这样的:

           话说,国家A,有个方法叫引爆原子弹() ,调用这个方法就在它本国(线程A中)干些事情:引爆一个原子弹.

    二 为什么需要SynchronizationContext这个内奸

           有一天,国家B远程调用国家A.引爆原子弹().   

           可想而知, 国家A当然会说,干你xxYY,我顶你的肺,一边凉快去(抛出异常,非法操作)。

           这时,国家B不甘心啦,找个内应:我们的主角--国家A的内奸(线程A中的SynchronizationContext对象)。

    三 如何找到SynchronizationContext内奸

           内奸不是说有就有的啦,上哪里去找呀:

                 如果线程A是

                 (1)UI线程,微软保证,该UI线程必有一个内置SynchronizationContext对象(国家A的必有内奸);这样把它找出来:

    SynchronizationContext uiContext =SynchronizationContext.Current;

                 (2)非UI线程,该非UI线程就得自己创造出一个SynchronizationContex对象(国家A的没有内奸,得自己创造一个内奸)。这样把它创建出来:

    1             // create a sync context for this thread
    2             var context = new SynchronizationContext();
    3             // set this context for this thread.
    4             SynchronizationContext.SetSynchronizationContext(context);

    四  内奸SynchronizationContext的工作过程

     1      线程A的某个地方    
     2      { 
     3          //用以上方法得到SynchronizationContext对象(内奸)
     4          SynchronizationContext context = ...;
     5 
     6          // 创建线程B
     7           Thread threadB = new Thread(线程B中的方法);
     8  
     9           //线程A将内奸传递给线程B
    10           threadB.Start(context);
    11       }
    12   
    13     
    14      private void 线程B中的方法(object state)
    15       {
    16           SynchronizationContext context = state as SynchronizationContext;
    17   
    18           for (int i = 0; i < 1000; i++) //要引爆1000次!!!!,我顶你个肺啊
    19           {
    20               //线程之间在开始通讯。即:内奸开始引爆
    21               //内奸有两种方式引爆:Send(同步)和Post(异步)       
    22               context.Send(引爆原子弹, null);//同步就是:爆炸了再逃跑
    23 context.Post(引爆原子弹, null);//异步就是:边引爆边逃跑,两不误 24 } 25 } 26 27 private void 引爆原子弹(object state) 28 { 29 //在国家A(在线程A)中引爆原子弹(更新界面等); 30 }


    五 原子弹在何处引爆

            话说内奸SynchronizationContext引爆了原子弹,但是这颗原子弹爆炸地点据环境选择爆炸地点,(我顶你个肺)。

            那方法:

    1   private void 引爆原子弹(object state)  
    2 
    3    {
    4            //在国家A(在线程A)中引爆原子弹(更新界面等);  
    5    }

            到底将在哪个线程中执行(在那个国家爆炸)。

            根据个人测试有如下情况:

            如果线程A(国家A)是:

            (1)UI线程。不管内奸SynchronizationContext是用Send方法还是Post方法,方法  void 引爆原子弹(object state) 都在线程A中执行(国家A中爆炸)。

            (2)非UI线程,就看内奸SynchronizationContext是用Send方法还是Post方法而定了。

                 【1】内奸SynchronizationContext是用Send方法,方法  void 引爆原子弹(object state) 都在线程B中执行(国家B中爆炸,国家B玩火自焚啊,国家A的内奸SynchronizationContext良心发现了)。

                 【2】内奸SynchronizationContext是用Post方法,方法  void 引爆原子弹(object state) 都在一个新的线程C中执行(国家C中爆炸,国家C郁闷了没招谁惹啊)。

    六 撒u啦啦

                

  • 相关阅读:
    C++中的名字重整技术
    Linux下C++开发常用命令
    《Effective C++(第三版)》 的55条建议
    我也介绍下sizeof与strlen的区别
    POJ
    HDU
    HDU-1754-I Hate It(单点更新+区间查询)
    HDU多校1003-Divide the Stones(构造)
    Just an Old Puzzle(2019多校1007)
    Idiomatic Phrases Game(最短路+注意坑点)
  • 原文地址:https://www.cnblogs.com/easy5weikai/p/2848133.html
Copyright © 2020-2023  润新知