简单的Windows窗体不显示

时间:2016-07-15 16:54:32

标签: forms visibility show

我拼凑了一些代码,这些代码遍历我所有驱动器上的所有目录,搜索符合条件的文件。我希望通过将匹配文件的文件名写入简单的Windows窗体(" textBox1.Text = fi1.FullName;")来处理每个目录时记录我的搜索进度;但是,在搜索完成之前,表单不会显示。虽然我怀疑Window窗体在搜索结束之前是不活动的(因此写入它是无效的),但我不确定如何在搜索过程中使表单可见。请问有人可以花点时间查看代码并告诉我吗?

感谢您的帮助。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace FindFiles
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            var searchPattern = ".jpg";
            var matchedFiles = FindMatchingFiles(searchPattern);
        }

        private List<string> FindMatchingFiles(string searchPattern)
        {
            var l = new List<string>();
            var allDrives = DriveInfo.GetDrives();

            foreach (var d in allDrives.Where(d => d.IsReady))
            {
                foreach (var file in GetFiles(d.Name)) 
                {
                    if (!file.EndsWith(searchPattern)) continue;
                    var fi1 = new FileInfo(file);
                    textBox1.Text = fi1.FullName;
                    l.Add(file);
                }
            }
            return l;
        }

        static IEnumerable<string> GetFiles(string path)
        {
            var queue = new Queue<string>();
            queue.Enqueue(path);
            while (queue.Count > 0)
            {
                path = queue.Dequeue();
                try
                {
                    foreach (var subDir in Directory.GetDirectories(path))
                    {
                        queue.Enqueue(subDir);
                    }
                }
                catch (UnauthorizedAccessException) { }
                string[] files = null;
                try { files = Directory.GetFiles(path); }
                catch (UnauthorizedAccessException) { }
                if (files == null) continue;
                foreach (var t in files) { yield return t; }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

问题是您的搜索代码在UI线程中运行。在搜索代码完成之前,UI不会更新。

查看BackgroundWorker及其ReportProgress机制,以执行长时间运行的代码,而不会阻止UI。

答案 1 :(得分:1)

看一下异步编程 async and await。让您的搜索发生在不同的线程中。

https://msdn.microsoft.com/en-us/library/hh191443.aspx