1

背景フォームが移動し続け、「フリーズ」しないように、この下の関数をスレッド化しようとしています。誰かがこれを行うのを手伝ってくれますか?

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

1 に答える 1

4

全体をバックグラウンド スレッド (おそらくBackgroundWorker.NET Task4 で)に入れ、UI を更新する場合はControl.InvokeorControl.BeginInvokeを使用して UI スレッドにマーシャリングします。

UI で結果を呼び出して使用することはできませんGetFiles。少なくとも C# 5 までは、async/await を使用してこれらすべてを簡単に行うことができます。それは完了です - また、個々のファイルが見つかったときです。基本的に、反復子ブロックを放棄しcount、クラス内で状態を保持するか、終了時に UI スレッドにコールバックするときにバックグラウンド スレッドが合計カウントを報告するようにします。

于 2011-11-01T17:49:04.857 に答える