假设有一个类A,它有2个方法M1,M2。M1因为定时器会周期性的执行,M2由用户操作引发执行。
问题是,程序执行的时候,一定会保证M1,M2的执行顺序吗?M1 M2或M2 M1,就像事务调度一样。
会不会在M2执行的过程中,M1开始执行呢?
如果Dotnet自身并不这样保证,那么怎么才能够实现这种需求呢?
如果是多线程,可以使用通过对象锁定进行线程同步,现在遇到的情况是M1,M2 均在一个线程中执行?不知道谁有这方面的经验,谢谢指教!

解决方案 »

  1.   

    up!
    定时器控制的方法m1,
    还是取决于这个定时器是否单独另开了一个线程,
    如果是的话,才有可能m1,m2同时在执行,
    如果不是,那当然要看进程执行时调用的先后顺序,而不是定义的先后顺序。
      

  2.   

    M1在线程池的线程中,M2在UI线程中,不会有执行顺序问题。
      

  3.   

    一个线程同时只能做一件事,所以M1和M2不会同时被执行的! 会不会M1方法执行到一半(如果有10条语句,执行到第5条),开始执行M2 ,M2 完成后,再执行M1剩下的一般呢?
      

  4.   

    由于线程调度,确实会发生M1执行一半然后执行M2的情况,所以没有办法确保他们之间的顺序,但是你可以通过将M1,M2设置为互斥事件就可以解决你的问题。例如:设置bool locked,当M1,M2事件中的一个执行时,锁定 locked,执行完解锁。关于互斥,可以参考MSDN和操作系统的相关内容。
      

  5.   

    @seonxp
    将M1,M2设置为互斥事件就可以解决你的问题。例如:设置bool  locked具体是怎么做的,我不太明白。
    你指的是lock(object)?,问题是M1,M2被在同一个线程执行时,lock好像不行。
      

  6.   

    @shilei831115
    加入M1,M2会操作同一个数据,如M1,M2同时对数组进行修改操作,这样就有可能出问题了。
      

  7.   

    在同一个线程上的话你不需要lock,但现在是不同的线程操作同一个数据,因此要lock,正是你所想的lock(object)
      

  8.   

    做了个实验,当一个方法在进行中的时候,Timer事件是不会触发的。
    但如果在进行中的方法中调用了Application.DoEvents(),则在此处阻塞并触发Timer事件(如果事件发生了的话),处理完事件再回来继续执行 private void button1_Click(object sender, EventArgs e)
            {
                timer1.Start();
                while (this!=null)
                //Application.DoEvents()    ;
                return;
            }        private void timer1_Tick(object sender, EventArgs e)
            {
                this.Text += "1";
            }
      

  9.   

    当我做了以下修改时,我的机器很不争气的死掉了...private void timer1_Tick(object sender, EventArgs e)
            {
                while(true) Application.DoEvents();
            }
      

  10.   

    你直接在M2/M1一开始判断M1/M2是否存在,存在就Join它,这样就保证顺序了……
      

  11.   

    @Ivony
    你直接在M2/M1一开始判断M1/M2是否存在,存在就Join它,
    没有明白你说的意思
      

  12.   

    Form命名空间下面的Timer组件引发的事件是在主线程执行的。所以不会出现线程冲突,楼主不需要担心这个问题。