c # Как вы продвигаете рекурсивный поиск в каталоге? - PullRequest
1 голос
/ 01 ноября 2011

Я пытаюсь проделать эту функцию ниже, чтобы фоновая форма продолжала перемещаться и не зависала, может кто-нибудь помочь мне в этом?

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

1 Ответ

4 голосов
/ 01 ноября 2011

Поместите все это в фоновый поток (возможно, с BackgroundWorker, возможно, с Task в .NET 4) и используйте Control.Invoke или Control.BeginInvoke, чтобы маршалировать обратно в поток пользовательского интерфейса, когда вы хотите обновитьПользовательский интерфейс.

Вы не сможете просто позвонить GetFiles и использовать результат в пользовательском интерфейсе - по крайней мере, до C # 5, что упростит все это с помощью async / await - но вы можетезаставить фоновый поток "сообщать" потоку пользовательского интерфейса, когда он завершен, а также когда он находит каждый отдельный файл.По сути, оставьте блок итератора и либо сохраните count как состояние внутри класса, либо заставьте фоновый поток сообщать об общем количестве, когда он обратится к потоку пользовательского интерфейса после его завершения.

...