在复制大量文件期间,UI无法响应

时间:2012-12-24 07:41:32

标签: c# .net winforms multithreading timer

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

我已经编写了一个备份管理器项目,我提供了一个文件夹,它将每个文件和文件夹复制到另一个位置,依此类推。

它有效(复制作业是否正常)但在复制期间大约需要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);
    }
}

我在基于特殊间隔的计时器中运行它,如果我使用线程,我应该省略计时器吗?引导我,我很困惑。

4 个答案:

答案 0 :(得分:1)

由于您对线程不够自信,我强烈建议您阅读Joe Albahari's Threading in C# Tutorial。并行编程是指您在“并行”或同时执行多个操作(主要用于在多个CPU或GPU内核上传播大量计算)。在这种情况下,您希望线程在复制所有文件时使您的UI响应。基本上,你会有这样的东西:(在你阅读C#教程中的线程后)

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

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

编辑:至于你的计时器,它的运行频率是多少?

答案 1 :(得分:1)

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

使用示例在我上面链接的页面上。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

后台工作程序可用于实现异步执行。 此链接可能有所帮助 http://www.codeproject.com/Articles/20627/BackgroundWorker-Threads-and-Supporting-Cancel