开不了的,线程X,在A里面特殊情况要等待执行了B之后,用户手动点下Button才能让线程X继续执行X,而且在此过程中要一直锁定B方法,不让其他线程访问。

解决方案 »

  1.   

            bool run = false;
            void button()
            {
                run = true;
            }        void threadmethod()//线程委托函数
            {
                while (true)
                {
                    while (run)
                    {
                        A();
                    }
                    thread.sleep(1000);
                }
            }
            void A()
            {
                if (异常)
                {
                    B();
                    F();
                    run = false;
                    return;
                }
                B();
            }
    自己瞎想的,不知如题不?
      

  2.   

    理下思路,能否这样去实现呢?
    点击Button后作一判断,即是你后面所讲到的特殊情况。如果条件成立则就执行你本来的代码,如果条件不成立提示用户再次点击按钮,然后再执行你原有的代码。
      

  3.   

    回6楼:如果现在线程1去在执行特殊情况,去调用了F,F里面去调用B,但这个时候用户没点按钮,恰恰线程2已经结束了正常情况,他也去调用了方法B,那么如果这个时候用户在点按钮,那么就不行了。
      

  4.   

    一直没看明白,在A里加个IF不行么?
    IF(特殊情况)
    B()
    ELSE

    B()
    总之,B执行完就等按钮,不知道复杂在哪?
      

  5.   

    楼上的明显没有思考IF(特殊情况)
    B()
    ELSE

    B()如果这个时候其他线程也进入B了呢?而且Button的click事件没促发怎么往下走?
      

  6.   

    System.Threading.ManualResetEvent allDone = new ManualResetEvent(false);
            private void button1_Click(object sender, EventArgs e)
            {
                if (allDone.WaitOne())//开始先不用看这个,看到最后我说的话在回过来看这句话
                {                     //这块就下叫做 Y 吧
                    allDone.Set();
                }
    //当一个button事件点击后,使用多线程去调用方法A,A方法执行完毕的时候会去调用方法B(所以我们可以认为A B 方法是在同一个线程里,也就是先执行A在执行B,我们可以把这2个方法放到方法C里,用一个线程去调用方法C,同样的效果,先调用A,A执行完之后再执行B)
                System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(C));
                th.IsBackground = true;
                th.Start();
                        }
            private void C()
            {
                A();
                B();
            }
    private void A()
    {
    if (true)//你说:就是在执行方法A的时候会有一种特殊情况F,然后线程暂停,(那好,当达到一定条件的时候A会先调用F,你想问线程暂停呢?别着急,往下看)
    {
          F();
    }
    }
            private void B()
            {
                
            }
            private void F()
            {
    //你说:这时候需要提前去 调用一次方法B(OK,没问题,因为你这个线程是需要暂停的,所以你不能再当前线程去调用方法B,所以在这我又开了一个新线程去调用方法B,th.Start()的时候就会去执行方法B了,暂停?往下看!)
                System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(B));
                th.IsBackground = true;
                th.Start();            allDone.WaitOne();//这句话就是让你的线程等待,暂停了       这句话先叫做 X//你说:等待Button事件,Button事件点击后线程才能继续执行方法A,然后方法A执行完毕后依然会去调用方法B,线程结束。
    //这时候你在点击Button1的时候就会进入我开始提到的那个if 这次点击就是你说的等待Button事件,好,这次事件来了,进入if    因为  X 语句所以他会进入那个if语句,当执行了allDone.Set()这句话之后,之前暂停的线程会瞬间开启继续执行,F方法继续执行,因为A方法里面调用的F方法,而且他们又是同一个线程,所以F方法继续执行就是你说的这句话“Button事件点击后线程才能继续执行方法A”,这时候方法A执行完毕之后依然会去调用你的方法B,这就是你说的“然后方法A执行完毕后依然会去调用方法B,线程结束。”
            }
      

  7.   


    public class threadA
    {
    private threadB = new threadB;
    private Thread a = null;
    public threadA
    {
    a = new Thread(new ThreadStar(Start));
    }
    public void Start
    while(thradB.WaitStatus = WaitStatus.WaitB)
    {
    lock(WaitStatus)
    {
        lock(threadB.lockObj)
    {
    //....
    }
    }
    }threadF code}
    public class threadB
    {
    private Thread b = null;
    public static object lockObj = new object();
    public threadB()
    {
    lock(lockObj)
    {
    b = new Thread(new ThreadStart(dddd));
    }
    }
    }
    public class threadF
    {
    public threadF()
    {
    while(thradB.WaitStatus = WaitStatus.None)
    {
    }
    }
    public class common
    {
    public WaitStatus WaitStatus = WaitStatus.None;
    }
    public enum WaitStatus
    {
    None, WaitF, WaitB
    }我的思路是:提供一个公共静态变量来表示锁定状态,在要访问B的线程里加上
    while(现在!=状态.None)
    {
    Thread.Sleep(200);
    }
    知道B的锁定状态被解除,即其他对象访问放里以后才能继续访问。
      

  8.   

    public class threadA
    {
    private threadB = new threadB;
    private Thread a = null;
    public threadA
    {
    a = new Thread(new ThreadStar(Start));
    }
    public void Start
    while(common.WaitStatus == WaitStatus.WaitB)
    {
    lock(common.WaitStatus)
    {
        lock(threadB.lockObj)
    {
    //....
    }common.WaitStatus = WaitStatus.None;
    }
    }//threadF code}
    public class threadB
    {
    private Thread b = null;
    public static object lockObj = new object();
    public threadB()
    {b = new Thread(new ThreadStart(dddd));}
    }
    public class threadF
    {
    public threadF()
    {
    while(thradB.WaitStatus = WaitStatus.None)
    {
    }
    }
    public class common
    {
    public WaitStatus WaitStatus = WaitStatus.None;
    }
    public enum WaitStatus
    {
    None, WaitF, WaitB
    }