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中显示一个,但是我写的这个程序和普通的单线程的效果一样,他不和主线程进行交互,都是等全部都查找完才显示,请问各位高手我哪里理解错了。
{
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中显示一个,但是我写的这个程序和普通的单线程的效果一样,他不和主线程进行交互,都是等全部都查找完才显示,请问各位高手我哪里理解错了。
改成
listBox1.BeginInvoke(ddd, new object[] {Path });
Invoke()是同步的,BeginInvoke()是异步的
在这句代码后面加上Thread.Sleep(50);
试试
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 });//这句应该放到那个循环体里,循环体里的那句应该放到委托函数里
并且你的委托函数没有写