// 封装2个属性的操作 ,label3和label5的Text属性表示文件的转换状态以及转换的进度,
我的意创建一个线程,然后运行相应的方法,显示文件转换的进图(X%)和正在转换的图片    
    public Label Label3
        {
            get { return this.label3; }
        }
        public Label Label5
        {
            get { return this.label5; }
        }
              
    // 是一个  ParameterizedThreadStart 类型委托调用的方法,表示正在转换的进度以及正在转换的图片的信息
        private void RecState2(object obj)
        {
            ListViewItem lll = (ListViewItem)obj;
            //--强转
            this.label3.Text = "正在转换.." + lll.SubItems[0].Text.Substring(0, lll.SubItems[0].Text.LastIndexOf("."));
            this.label5.Text = Convert.ToString((this.progressBar1.Value / HowMuchItems) * 100) + "%";        }   ///表示开始转换按钮
        private void button_convery_Click(object sender, EventArgs e)
        {
            try
            {               // 定义委托实例
                ParameterizedThreadStart diaplaylabel = new ParameterizedThreadStart(RecState2);
//  建立线程实例
                Thread labeldisplaythread = new Thread(diaplaylabel);
//引发线程                
labeldisplaythread.Start();
                foreach (ListViewItem lll in this.imagelist.Items)
                {
                    imagegg = Image.FromFile(lll.SubItems[1].Text + @"\" + lll.SubItems[0].Text);
                    //--- 这里是转换格式的操作
                    //ICON部分代码已经无用
                    if (this.choseformat.SelectedItem.ToString() == "Icon")
                    {
                        imagegg.Save(FolderPath + @"\" + lll.SubItems[0].Text.Substring(0, lll.SubItems[0].Text.LastIndexOf(".")) + @".ico", (ImageFormat)this.choseformat.SelectedItem);
                    }
                    else                        imagegg.Save(FolderPath + @"\" + lll.SubItems[0].Text.Substring(0, lll.SubItems[0].Text.LastIndexOf(".")) + @"." + this.choseformat.SelectedItem.ToString(), (ImageFormat)this.choseformat.SelectedItem);
               
                                       this.progressBar1.Value++;                 
                 // 这里是在一个Foreach循环中 激活方法,请看上面
                     this.RecState2((object)lll);                                }
//在循环完毕后,终止线程。。
             labeldisplaythread.Abort();
                if (this.progressBar1.Value == HowMuchItems)
                    MessageBox.Show("成功把" + HowMuchItems.ToString() + "个图像文件,转化成" + this.choseformat.SelectedItem.ToString() + "格式");
                this.label3.Text = "转换成功";            }            catch (Exception exp)
            {
                MessageBox.Show(exp.Message);
            }
        }/// 但是,一切都看着是那么的顺利,但是在我点击了转换按钮,就是执行了面的程序后,,这个程序整个退出了!!!
没有任何的征兆。。就直接退出了?搞不懂啊。再就是了,我调试的时候发现,是可以执行的(只是界面没有显示,)在 RecState2 方法里面设置断点,编译器和执行到了。。
但是为什么退出了???
大家,请来讨论一下
或是提一些有用的意见。。小弟不胜感激     

解决方案 »

  1.   

    委托操作UI
    backgroundWorker
    控件或窗体.Invoke((EventHandler)delegate
    {
      
    });
      

  2.   

    答案在http://topic.csdn.net/u/20110201/13/f0e938cd-52ff-497e-91a0-d74d3724052d.html中,我的回复部分。
      

  3.   

    恩,加了DoEvent() 可以实现了。
      

  4.   


    看看你的代码:try
    {
      ParameterizedThreadStart diaplaylabel = new ParameterizedThreadStart(RecState2);
      Thread labeldisplaythread = new Thread(diaplaylabel);
      labeldisplaythread.Start();
      .......
      labeldisplaythread.Abort();
    }
    catch(...)
    {
    }
    这里不会出产生异常。labeldisplaythread.Start()代码一瞬间就执行完了,同时labeldisplaythread.Abort()也只是发一个消息给线程(也是一瞬间就执行完了),这两条语句并不会产生异常。结果就是,你的try...catch...根本没有写到你想捕获的那个异常的地方,所以它不会运行。
      

  5.   

    首先搞清楚、测试出哪一条语句出了异常,然后才找对地方写你的try...catch...代码。你的try...catch...代码所放的位置,并不是抛出异常的地方。