gpt4 book ai didi

c# 你如何线程递归目录搜索?

转载 作者:太空宇宙 更新时间:2023-11-03 22:07:16 25 4
gpt4 key购买 nike

我正在尝试线程化下面的函数,以便背景表单可以继续移动并且不会“卡住”,任何人都可以帮助我这样做吗?

    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();
}

最佳答案

将整个事情放入后台线程(可能使用 BackgroundWorker,可能使用 .NET 4 中的 Task)并使用 Control.InvokeControl.BeginInvoke 在您想要更新 UI 时编码回 UI 线程。

您将不能只调用 GetFiles 并在 UI 中使用结果 - 至少在 C# 5 之前,这将使所有这些使用 async/await 变得更容易 - 但你可以让后台线程在完成时“告诉”UI 线程 - 以及在找到每个单独的文件时。基本上,放弃迭代器 block ,或者将 count 保留为类中的状态,或者让后台线程在完成时回调到 UI 线程时报告总计数。

关于c# 你如何线程递归目录搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7970545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com