1

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

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

它可以工作(复制工作很好),但在复制过程中大约需要 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

4 回答 4

1

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

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

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

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

于 2012-12-24T07:52:33.403 回答
1

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

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

于 2012-12-24T07:59:04.390 回答
1

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

 ThreadPool.QueueUserWorkItem(delegate
 {
    CopyFiles(folder, dest);
 });
于 2012-12-24T08:30:26.467 回答
0

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

于 2012-12-24T07:59:20.303 回答