我正在尝试将此功能设置为以下功能,以便后台形式可以继续移动并且不会“冻结”,任何人都可以协助我这样做吗?
public IEnumerable<string> GetFiles(string path)
{
Queue<string> queue = new Queue<string>();
queue.Enqueue(path);
while (queue.Count > 0)
{
path = queue.Dequeue();
try
{
foreach (string subDir in Directory.GetDirectories(path))
{
queue.Enqueue(subDir);
}
}
catch (Exception ex)
{
richTextBox1.AppendText(ex.Message);
}
string[] files = null;
try
{
files = Directory.GetFiles(path);
}
catch (Exception ex)
{
richTextBox1.AppendText(ex.Message);
}
if (files != null)
{
for (int i = 0; i < files.Length; i++)
{
yield return files[i];
}
}
}
}
我使用以下按钮执行代码:
private void button1_Click(object sender, EventArgs e)
{
int count = 0;
FolderBrowserDialog dialog = new FolderBrowserDialog();
dialog.ShowDialog();
string selected = dialog.SelectedPath;
foreach (string file in GetFiles(selected))
{
count++;
richTextBox1.AppendText(file + Environment.NewLine);
}
label2.Text = count.ToString();
}
答案 0 :(得分:4)
将整个事情放入后台线程(可能使用BackgroundWorker
,可能在.NET 4中使用Task
并使用Control.Invoke
或Control.BeginInvoke
编组回到当您想要更新UI时,UI线程。
你将无法只调用GetFiles
并在UI中使用结果 - 至少在C#5之前,这将使async / await更容易实现这一切 - 但你可以制作背景线程“告诉”UI线程何时完成 - 以及何时找到每个单独的文件。基本上,放弃迭代器块,并将count
保持为类中的状态,或者让后台线程报告在完成时回调到UI线程时的总计数。