日期:2014-05-16  浏览次数:20739 次

小弟求解,关于线程与委托
  写了一段程序,用于搜索文件并将它们显示在listview之中,当用单线程方式时,程序会在搜索的时候导致窗口“锁住”,也就是不能进行窗口操作,包括listview的实时更新与窗口大小的调整。于是加入的多线程,但是为什么调用了多线程后依然没有任何效果,还是“锁住”,请问是我电脑的问题吗?还是我压根就没有实现多线程。
 public partial class Form1 : Form
    {
        string search;
        delegate void setList();
        setList set = null;
        public Form1()
        {
            InitializeComponent();
            
        }
        private void Search()
        {
            set = delegate()
            {

                listView1.Clear();
                search = textBox1.Text;
                //searchFile(@"C:\WINDOWS\system32");
                DirectoryInfo di = new DirectoryInfo(@"C:\WINDOWS\system32");
                FileInfo[] f = di.GetFiles(search);
                foreach (FileInfo fi in f)
                    listView1.Items.Add(fi.Name);
            };
            listView1.Invoke(set);

        }
private void button2_Click(object sender, EventArgs e)
        {

            Thread t = new Thread(new ThreadStart(Search));
            t.Start();
        }

------解决方案--------------------
引用:
Quote: 引用:

线程不能直接操作主界面啊 这个时候就用委托
我没有直接调用啊, 这不是用委托了吗?没有出现“无法调用非本线程的控件”的错误,怎么办。。。


di.GetFiles(search);这步耗时,可是你把这步也放到Invoke里面了,只需要把 listView1.Items.Add(fi.Name);放到Invoke即可,还有,如果文件多的话,你这样add也慢,用addrange方法或者调用类似beginupdate,endupdate之类的方法,把add过程放在中间,这样界面可以最后统一绘制,而不是插入一条绘制一条
                   
------解决方案--------------------
在循环里面Invoke,而不是在Invoke里面循环
        private void Search()
        {
            listView1.Clear();