c# - 如何通过在 WPF 中使用 .GetFiles 来防止“UI 冻结”
问题描述
这是一个比较两个文件夹内容的功能。
问题:
使用 System.IO.DirectoryInfo.GetFiles() 时,应用程序冻结(15 秒),我知道这是因为它正在使用主线程......它是 10 GB。
我不使用线程、同步或其他什么的原因是因为我需要主线程中的“fileInfosToCopy”列表,所以当我要使用线程时,我无法再访问它了。
有任何想法吗?我只需要主线程中的“fileInfosToCopy”列表。
string pathA = @"\\server\share\folder";
string pathB = @"C:\folder";
public void Scan()
{
try
{
string Computer = "server";
Ping ping = new Ping();
PingReply reply = ping.Send(Computer);
if (reply.Status == IPStatus.Success)
{
var netwerkfolder = new DirectoryInfo(pathA);
var localfolder = new DirectoryInfo(pathB);
var networkfiles = netwerkfolder.GetFiles("*.*", SearchOption.AllDirectories);
var localfiles = localfolder.GetFiles("*.*", SearchOption.AllDirectories);
var listmissingfiles = networkfiles.Select(s => s.Name).ToList().Except(localfiles.Select(s => s.Name)).ToList();
var fileInfosToCopy = new List<FileInfo>();
foreach (var info in networkfiles)
{
if (listmissingfiles.Contains(info.Name))
{
fileInfosToCopy.Add(info);
}
}
}
else
{
// not connected
}
}
catch (Exception)
{
// x
}
}
}
解决方案
您可以使用以下方式访问它:
Application.Current.Dispatcher.Invoke(() => fileInfosToCopy.Add(info));
WherefileInfosToCopy
将存在于该方法之外并由主线程创建(就像您最初可能拥有的那样)。
推荐阅读
- c++11 - 为什么我的代码会出现 SIGSEGV 运行时错误?
- node.js - 带有自定义标准输出流的 NodeJS execSync,用于收集输出并即时记录到终端
- php - 将十亿秒添加到 PHP 中的 DateTime 对象
- vue.js - 如何在 vuejs 中正确调整 CoreUI 侧边栏的宽度?
- symfony - 为什么 swiftmailer 不采用环境变量?
- python - 交替大写和小写字符
- c# - C# WPF 应用程序 - 显示第二个窗口
- algorithm - 在尊重约束的同时将 M 个实验分配给 N 个实验室
- html - 为什么这个 flexbox 布局在 IE11 中不起作用?
- homebrew - 如何使用 homebrew 安装特定的 llvm 包?