用户界面在复制大量文件时没有响应

本文关键字:响应 文件 复制 用户界面 | 更新日期: 2023-09-27 17:49:18

我需要你调试我关于这个项目的想法

我写了一个备份管理器项目,我给了一个文件夹,它把它的每个文件和文件夹复制到另一个位置,等等。

它可以工作(很好地完成复制工作),但是在复制过程中(大约需要1分钟)应用程序UI没有响应。我听说过线程,也见过并行编程这个词(只是这个词),现在我想要一些解释,比较和示例,以便能够切换我的代码。

我以前用线程做过非常简单的动作,但那是很久以前的事了,我对线程没有足够的信心。下面是我的代码:
private void CopyFiles(string path, string dest)
{
    System.IO.Directory.CreateDirectory(dest + "''" + path.Split('''')[path.Split('''').Count()-1]);
    dest = dest + "''" + path.Split('''')[path.Split('''').Count() - 1];
    foreach (string file in System.IO.Directory.GetFiles(path))
    {
        System.IO.File.Copy(file, dest + "''" + file.Split('''')[file.Split('''').Count() - 1]);
    }
    foreach (string folder in System.IO.Directory.GetDirectories(path))
    {
        CopyFiles(folder, dest);
    }
}

我在一个基于特殊间隔的计时器中运行这个,如果我使用线程,我应该忽略计时器吗?

用户界面在复制大量文件时没有响应

既然你对线程没有足够的信心,我强烈建议你阅读Joe Albahari的《c#线程教程》。并行编程是指你"并行"或同时执行多个操作(主要是为了将大量计算分散到多个CPU或GPU内核上)。在这种情况下,您希望线程在复制所有文件时使UI响应。基本上,你会有这样的设置:(在你阅读了c#教程中的线程)

Thread copyFilesThread = new Thread(() => 
{
    CopyFiles(path, dest);
});
copyFilesThread.Start();

UI运行在自己的线程上。应用程序中的所有代码都将在UI线程上运行(除非您显式地使用线程)。由于CopyFiles方法需要很长时间,因此它将停止UI,直到复制工作完成。使用线程将在一个单独的线程上运行CopyFiles到UI线程,因此使UI线程响应。

编辑:至于你的计时器,它多久运行一次?

在单独的专用线程中执行操作的一种简单方法是使用BackgroundWorker,该方法可以让您知道线程何时完成。

用法的一个例子是在我上面链接的页面

如果您想要复制大量或未知数量的文件,您应该使用ThreadPool

 ThreadPool.QueueUserWorkItem(delegate
 {
    CopyFiles(folder, dest);
 });

后台worker可以用来实现异步执行。这个链接可能有帮助http://www.codeproject.com/Articles/20627/BackgroundWorker-Threads-and-Supporting-Cancel