相关代码:
        private delegate void AddMessageToListBox(string msg);
        private AddMessageToListBox messageToListBox;
        public Form1()
        {
            InitializeComponent();
            messageToListBox = new AddMessageToListBox(MessageToListBox);
        }
        private void MessageToListBox(string msg)
        {
            if (listBox1.InvokeRequired)
            {
                listBox1.Invoke(messageToListBox, msg);
            }
            else
                listBox1.Items.Add(msg);
        } private void button5_Click(object sender, EventArgs e)
        {
            MessageToListBox("Join线程1开始");
            Thread thread1 = new Thread(new ThreadStart(JoinTest1));
            thread1.SetApartmentState(ApartmentState.MTA);
            thread1.IsBackground = true;
            thread1.Start();
            thread1.Join();
            MessageToListBox("Join线程1完成");
        }        private void JoinTest1()
        {
           // MessageToListBox("Join线程1进入线程内部开始");
            Thread thread2 = new Thread(new ThreadStart(JoinTest2));
            thread2.SetApartmentState(ApartmentState.MTA);
            thread2.IsBackground = true;
            thread2.Start();
            thread2.Join();
           // MessageToListBox("Join线程1进入线程内部结束");
        }
        private void JoinTest2()
        {
          //  MessageToListBox("Join线程2内部结束");
        }线程2在执行 MessageToListBox("Join线程1进入线程内部开始");这个方法时程序卡死,不知道什么原因,请大家帮我分析。

解决方案 »

  1.   

    Join的意思就是“卡死”。没得商量,谁让你这么写呢?!
      

  2.   


            private delegate void AddMessageToListBox(string msg);
            private AddMessageToListBox messageToListBox;
            public Form1()
            {
                InitializeComponent();
                messageToListBox = new AddMessageToListBox(MessageToListBox);
            }
            private void MessageToListBox(string msg)
            {
                if (listBox1.InvokeRequired)
                {
                    listBox1.Invoke(messageToListBox, msg);
                }
                else
                    listBox1.Items.Add(msg);
            }
            object obj1 = new object();
            private void button1_Click(object sender, EventArgs e)
            {
                Thread thread = new Thread(new ParameterizedThreadStart(ParameterTest));
                thread.IsBackground = true;
                thread.Start("Parameter Test");
                thread.Join();
                MessageToListBox("Parameter Test Over");
            }
            private void ParameterTest(object obj)
            {
                lock (obj1)
                {
                    MessageToListBox("Testing");
                }
            }
    我发现还真是join的原因,但是有一个这样的问题,我吧lock里面换成其他内容。
      MessageToListBox("Testing");
    换成:
    int x= (int)(2 / 1);
    这样这个程序却是正常的,难道原因归结于jion?
      

  3.   


    join不是让里面的先执行完再执行后面语句?怎么试卡死了,我感觉更像是阻塞
      

  4.   


            public Form1()
            {
                InitializeComponent();
                messageToListBox = new AddMessageToListBox(MessageToListBox);
            }        private void MessageToListBox(string msg)
            {
                if (listBox1.InvokeRequired)
                {
                    listBox1.Invoke(messageToListBox, msg);
                }
                else
                    listBox1.Items.Add(msg);
            }        object obj1 = new object();        private void fun()
            {
                Thread thread = new Thread(new ParameterizedThreadStart(ParameterTest));
                thread.IsBackground = true;
                thread.Start("Parameter Test");
                thread.Join();
                MessageToListBox("Parameter Test Over");
            }        private void button1_Click(object sender, EventArgs e)
            {
                Thread t = new Thread(new ThreadStart(fun));
                t.IsBackground = true;
                t.Start();
            }        private void ParameterTest(object obj)
            {
                lock (obj1)
                {
                    MessageToListBox("Testing");
                }
            }
      

  5.   

    Thread类的Join()方法能够将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,线程A将插入线程B之前,直到线程A执行完毕后,才会继续执行线程B。
    所以,不卡才怪!