先上代码 代码比较多 注释掉部分代码
    private bool startFlag=false;
    protected bool _enableLeaveCancel = true;   //先后初始化_scanEnterThread  _scanLeaveThread 这两个线程
    _scanEnterThread = new Thread(scanEnterSensorChannel);
    _scanEnterThread.Start();
     ...
    _scanLeaveThread = new Thread(scanLeaveSensorChannel);
     _scanLeaveThread.Start();
     private void scanEnterSensorChannel()
        {
            while (true)
            {
              if (!startFlag)
                {
                   _enterProcessingThread = new Thread(invokeEnterProcessing);
                   _enterProcessingThread.Start();
                   _enterProcessingThread.Join();
                }
            }
        }        private void scanLeaveSensorChannel()
        {
            while (true)
            { 
            if (startFlag)
              {
               if (_enableLeaveCancel)
                {
                   _leaveProcessingThread = new Thread(invokeLeaveProcessing);
                   _leaveProcessingThread.Start();
                   _leaveProcessingThread.Join();
                }
               _enableLeaveCancel = true;
            }
                    
        }        private void invokeEnterProcessing()
        { 
            startFlag = true;
            this.Proccessor();//这个方法中存在一个线程池 且方法执行需要一段时间
            startFlag = false;
        }        private void invokeLeaveProcessing()
        {
            if (_enterProcessingThread != null)
                _enterProcessingThread.Abort();
           .....  
        }问题是这样的:先后实例化_scanEnterThread 、_scanLeaveThread 线程 在scanEnterSensorChannel方法中执行invokeEnterProcessing线程 试图将startFlag 变为true ,以便在_leaveProcessingThread 获取值执行后面的方法。但是我实际运行中发现invokeEnterProcessing()正常运行,但是在执行scanLeaveSensorChannel()时,发现startFlag =false,并没变为true 且经过其他手段测试发现_enterProcessingThread =null。 请问这是为什么,怎么解决?

解决方案 »

  1.   

    乱七八糟地关系,实在看不明白,懒得看了。提几条简单的意见:1. 既然 scanEnterSensorChannel 是某个事件之后才被触发执行的(使用线程执行也是一样),那么就放在事件(或者普通的委托回调)中执行就行了。而另外整个莫名其妙的线程去死循环,干什么东东?2. 给线程中方法传递参数,不要用什么全局变量。这是基本常识。
      

  2.   

    线程中去读取全局的变量,设计这种东西是非常谨慎的,不到万不得已不会去读取的。你弄一大堆死循环的线程,然后整一些全局变量去“协调”它们的调用关系,这是首先就乱了。因此不用考虑什么全局变量、“传参”的问题。先搞好时序设计。我可以非常明确地告诉你,你的程序中根本不应该出现什么while循环,其它循环也不应该出现。如果你搞死循环,那么你完全接受不了这些基础知识,也就无所谓进一步的程序设计了。
      

  3.   

    传递参数
    Thread th = new Thread(new ParameterizedThreadStart(method));
    th.Start("参数"));
    private void method(string s)
    {}

     Thread thread1 = new Thread(() =>  { Run(参数); });
     thread1.Start();
      

  4.   

    线程 传递参数,只能传递 一个 利用 OBJECT 的方式,thread.Start(object obj) 的方式。
      

  5.   

    多年前我做IM的时候,有个大学教授推荐来一个人(那个教授高度评价此学生说他作为一个大学生“完全具有硕士毕业的水平”),非要参与开发。我发现这个人非常地华而不实,尽量避免给项目造成损害。可是灾难还是在1个多月后出现了。我们的系统运行的非常慢,只有原来的几分之一的速度,其它程序员有两周都找不到问题。后来我实在看不下去了,花了大半天时间亲自动手查一下问题,无意中碰巧才发现,原来我们一个小任务(当窗口移动到屏幕边缘时要自动停靠和隐藏)明确地写着要在窗口移动事件中去处理,而这个人却弄了个定时器(50毫秒间隔)来搞。批评他时他振振有词:“我觉得这样设计更好”。当看到注释掉他的代码,程序立刻恢复了原来的用户体验,他才没话说了。实际上这是一个模式,那些在多线程(或者类似线程的windows消息泵机制)中出现循环程序的代码,其实完全不用动脑子就能立刻判断出来,这些都是害群之马、都是故意要把系统搞烂的代码。
      

  6.   

    曾经记得有大神给我说过  他做过一个最变态的项目  多线程  A线程处理的方法中需要B执行中产生的参数 B运行中需要A线程处理中产生的参数  完全就是混乱