none
如何解决多线程下关闭winform问题 RRS feed

  • 问题

  • 在多线程下,有个form2被多个线程调用,并且加了Lock{},但在各个线程没有执行完毕时,停止执行,这是引发死机异常,怎么解决??
    2010年1月19日 11:30

答案

  • 你好!
         初步怀疑是出现了死锁,如果方便的话,最好提供你的代码!
         实际上多线程的代码编写的时候一定要小心,很容易出现各种预料之外的问题!
    周雪峰
    2010年1月19日 12:25
    版主
  • 有可能是你的 startGetsite(); 这个方法里边出现了死锁


    Memory all alone in the moonlight~My Blog in .NET~~~
    2010年1月20日 1:17
    版主

全部回复

  • 你好!
         初步怀疑是出现了死锁,如果方便的话,最好提供你的代码!
         实际上多线程的代码编写的时候一定要小心,很容易出现各种预料之外的问题!
    周雪峰
    2010年1月19日 12:25
    版主
  •  public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            CheckCodeForm ccf;

            private void Form1_Load(object sender, EventArgs e)
            {
                td1 = new Thread(new ThreadStart(fangfa1));
                td2 = new Thread(new ThreadStart(fangfa2));
                td1.Name = "线程1";
                td2.Name = "线程2";
                td1.Start();
                td2.Start();
               
            }

            //线程1方法
            private void fangfa1()
            {
                int i;
                for (i = 0; i < icount; i++)
                {

                    try
                    {
                        //请求网站
                        SiteData.ID = site.list[i];
                        startGetsite();
                    }
                    catch
                    {
                        continue;
                    }
                  
                }
               
                td1.Abort();
            }

            //线程2方法
            private void fangfa2()
            {
                int i;
                for (i = icount; i < icount * 2; i++)
                {

                    try
                    {
                        //请求网站
                        SiteData.ID = site.list[i];
                        startGetsite();
                    }
                    catch
                    {
                        continue;
                    }
                   
                }
                td2.Abort();

            }

     //弹出新的窗口
            private void startGetsite()
            {

                    lock (this)
                {

                    ccf = new CheckCodeForm();
                    ccf.ShowDialog();//模态窗口
                  
                }
        
            }
          

            //停止按钮,关闭线程 关闭计时 关闭窗体
            private void btnStop_Click(object sender, EventArgs e)
            {

                try
                {

                       if (td1 != null)
                       {
                         td1.Abort(); //====关闭时,此处发生异常,引起死机

                       }
                       if (td2 != null)
                      {
                      
                        td2.Abort();
                      }
                 }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

                this.Close();

            }

          
        }

    2010年1月19日 13:09
  • 你好!
         这样的问题比较难重现,我这里没有抛出异常,请问具体是那个异常?
    周雪峰
    2010年1月19日 13:38
    版主
  • 这是form1中的负责刷新显示的方法 

    private void ThreadFunction2()
            {
                try
                {
                    if (label1.InvokeRequired)
                    {
                        FlushClient fc = new FlushClient(ThreadFunction2);

                        label1.Invoke(fc);//通过代理调用刷新方法
                    }
                    else
                    {
                        pBar1.Value++;
                        label1.Text = "";
                        this.label1.Text = "共选择" + count + "个网站,已完成" + Convert.ToString(pBar1.Value) + "个";
                        this.label1.Refresh();

                       
                    }
                }
                catch
                { }
            }

    会不会是这个引起的死锁。

    2010年1月19日 14:16
  • 你好!
         你那行代码,具体抛出什么异常,能告诉我吗?
    周雪峰
    2010年1月19日 14:53
    版主
  • 谢谢周版主,明天吧。太辛苦你了。这是我的QQ:419947535 能加为QQ好友,更方便!真的太谢谢了!
    2010年1月19日 15:46
  • 不客气啊!
    不好意思,我没有QQ,这是我的MSN:xuefeng1982@live.cn
    周雪峰
    2010年1月19日 16:02
    版主
  • 有可能是你的 startGetsite(); 这个方法里边出现了死锁


    Memory all alone in the moonlight~My Blog in .NET~~~
    2010年1月20日 1:17
    版主