按理说多线程界面不会有卡的现,因为是两个线程,新开的线程和UI线程不是一个线程,跨线程访问UI会出现问题,所以很可能出现在更新UI的语句上。

解决方案 »

  1.   

    我就是用listView1.Items.Add()方法来更新ui的啊,应该是不会出现问题的啊。。
      

  2.   

    我就是用listView1.Items.Add()方法来更新ui的啊,应该是不会出现问题的啊。。有没有用begininvoke啊?
      

  3.   


    捕获你的子线程中的程序抛出的异常。debug和release编程是不一样的。debug需要即时调试,而release需要容错,因此代码不一样。你做到了吗?
      

  4.   

    我就是用listView1.Items.Add()方法来更新ui的啊,应该是不会出现问题的啊。。有没有用begininvoke啊?没有,这个是干什么用的?
      

  5.   

    我就是用listView1.Items.Add()方法来更新ui的啊,应该是不会出现问题的啊。。
    把这个方法定义成委托的调用,用控件的invoke去调用委托 实现方法 试试吧
      

  6.   

    看看委托刷新UI有没有问题,附个示例:
    public class MyForm : System.Windows.Forms.Form {
                
        //UI 元素
        private Label lblStatus;
        
        private ProgressBar progressBar1;    //Delegate
        private delegate void MyProgressEventsHandler(
            object sender, MyProgressEvents e);    
         private void UpdateUI(object sender, MyProgressEvents e) {
            lblStatus.Text = e.Msg;
            myProgressControl.Value = e.PercentDone;
        }   //ShowProgress 现在可以记录为可从任何线程调用的公共方法。
        public void ShowProgress(string msg, int percentDone) 
       {
    if(InvokeRequired)
    {
       System.EventArgs e = new MyProgressEvents(msg, percentDone);
               object[] pList = { this, e };           BeginInvoke(new MyProgressEventsHandler(UpdateUI), pList);
    }
    else
            {
        UpdateUI(this, new MyProgressEvents(msg,
                PercentDone)); 
            }
           
        }     private void btnStart_Click(object sender, EventArgs e)
         {
          //启动线程
          Thread t = new Thread(new ParameterizedThreadStart(RunsOnWorkerThread));
          t.IsBackground = true;
          t.Start(input);
         }    //线程执行函数
        private void RunsOnWorkerThread() 
        {
            int i = 0;   
            while(...) //loop      
            {  
              DoSomethingSlow();
              ShowProgress("test",i);
              ++i;
            }
        }
       
    }