首页 > 解决方案 > 如何通过在 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
        }
    }
}

标签: c#wpfmultithreading

解决方案


您可以使用以下方式访问它:

Application.Current.Dispatcher.Invoke(() => fileInfosToCopy.Add(info));

WherefileInfosToCopy将存在于该方法之外并由主线程创建(就像您最初可能拥有的那样)。


推荐阅读