在多线程操作界面会很卡,不知怎么解决
比如:
for(int i=0;i<listView1.Items.Count;i++)
{
   listView1.Items[i].Text = "0";
}
创建一个Thread执行以上代码,会卡死在那里,直到循环执行完毕,这个问题如何解决呢?谢谢
(多线程已用委托调用)

解决方案 »

  1.   

    这应该是机器的问题。你的机器cup应该是单核的比较老的吧?。多线程处理的时候如果太繁忙机器处理不过来的时候整个程序都是卡在那的(主要是响应不过来),
      

  2.   

    sleep一下不会卡死,但是还是有些卡
      

  3.   

    for(int i=0;i <listView1.Items.Count;i++) 

      listView1.Items[i].Text = "0"; 
      Application.DoEvents(); //加上这句试试.

      

  4.   

    既然线程回调做了处理,
    BeginUpdate / EndUpdate 能否帮上你呢?
      

  5.   

    应该没问题吧,不知你是怎样实现的.我测试了下...    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                Control.CheckForIllegalCrossThreadCalls = false;
            }        private void Form1_Load(object sender, EventArgs e)
            {
                InitControl();
            }        private void btnReset_Click(object sender, EventArgs e)
            {
                InitControl();
            }        private void InitControl()
            {
                listView1.Items.Clear();
                for (int i = 0; i < 100; i++)
                { 
                    listView1.Items.Add(new ListViewItem(i.ToString()));
                }
            }        private void btnDo_Click(object sender, EventArgs e)
            {
                MyTestClass cls = new MyTestClass();
                cls.MyDoEvent += new DoHandler(cls_MyDoEvent);
                cls.Count = listView1.Items.Count;
                ThreadStart start = new ThreadStart(cls.DoSome);
                Thread th = new Thread(start);
                th.Start();
               
            }        void cls_MyDoEvent(int i)
            {
                listView1.Items[i].Text = string.Format("{0}...",i);        
            }        public delegate void DoHandler(int i);        private class MyTestClass
            {
                public event DoHandler MyDoEvent;            private int count = 0;
                public int Count
                {
                    set
                    {
                        count = value;
                    }
                }
                public void DoSome()
                { 
                    if(MyDoEvent!=null)
                    {
                        for (int i = 0; i <count; i++)
                        {
                            Thread.Sleep(100);
                            MyDoEvent.Invoke(i);
                        }
                    }
                }
            }
       
        }