public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string search;
        
        public void Search()
        {
            SearchDir("c:\\windows");
        }
        public void SearchDir(string Path)
        {
            dd ddd = delegate(string xxx)
           {
               DirectoryInfo di = new DirectoryInfo(xxx);
               FileInfo[] f = di.GetFiles(search);
              
               foreach (FileInfo myFile in f)
               {
                   listBox1.Items.Add(myFile.FullName);
               }
                           DirectoryInfo[] d = di.GetDirectories();
               foreach (DirectoryInfo myDir in d)
                   SearchDir(myDir.FullName);
           };
            listBox1.Invoke(ddd, new object[] {Path });
        }        private void button2_Click(object sender, EventArgs e)
        {
            search = textBox1.Text;
            listBox1.Items.Clear();
            Thread t = new Thread(new ThreadStart(Search));
            t.Start();
        }
        delegate void dd(string xxx);    }
这个查找跟我预想的不一样啊,我想的是找到一个文件名就在listbox1中显示一个,但是我写的这个程序和普通的单线程的效果一样,他不和主线程进行交互,都是等全部都查找完才显示,请问各位高手我哪里理解错了。

解决方案 »

  1.   

    listBox1.Invoke(ddd, new object[] {Path });
    改成
    listBox1.BeginInvoke(ddd, new object[] {Path });
    Invoke()是同步的,BeginInvoke()是异步的
      

  2.   

    listBox1.BeginInvoke(ddd, new object[] {Path }); 
    在这句代码后面加上Thread.Sleep(50);
    试试
      

  3.   

    不能在一个线程中访问UI线程创建的资源,
                dd ddd = delegate(string xxx)
               {
                   DirectoryInfo di = new DirectoryInfo(xxx);
                   FileInfo[] f = di.GetFiles(search);
                  
                   foreach (FileInfo myFile in f)
                   {
                       listBox1.Items.Add(myFile.FullName);
                   }
         
                   DirectoryInfo[] d = di.GetDirectories();
                   foreach (DirectoryInfo myDir in d)
                       SearchDir(myDir.FullName);
               };
                listBox1.Invoke(ddd, new object[] {Path });//这句应该放到那个循环体里,循环体里的那句应该放到委托函数里
    并且你的委托函数没有写