简单 Windows 表单未显示
Simple Windows Form Not Showing
我拼凑了一些代码,这些代码遍历我所有驱动器上的所有目录,搜索符合条件的文件。我希望通过将匹配文件的文件名写入一个简单的 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; }
}
}
}
}
问题是您的搜索代码是 UI 线程中的 运行。在您的搜索代码完成之前,UI 不会更新。
查看 BackgroundWorker 及其 ReportProgress 机制,以在不阻塞 UI 的情况下执行长 运行 代码。
看看异步编程
async and await。让您的搜索在不同的线程中进行。
我拼凑了一些代码,这些代码遍历我所有驱动器上的所有目录,搜索符合条件的文件。我希望通过将匹配文件的文件名写入一个简单的 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; }
}
}
}
}
问题是您的搜索代码是 UI 线程中的 运行。在您的搜索代码完成之前,UI 不会更新。
查看 BackgroundWorker 及其 ReportProgress 机制,以在不阻塞 UI 的情况下执行长 运行 代码。
看看异步编程 async and await。让您的搜索在不同的线程中进行。