在后台复制文件

时间:2013-01-31 14:41:58

标签: c# winforms multithreading client-server

当我将客户端连接到服务器时,客户端开始将一些dll文件复制到服务器。 发生这种情况时,表单会一直停滞,直到复制完成(有一些大文件)。

我希望在后台运行此副本,因为我希望用户能够继续与表单进行交互(打开一些浏览对话框等) 我会确保复制完成。

我想线程在这里会有所帮助,但我是线程的新手,而且我也不确定是不是这样做。

以下是复制dll文件的代码:

   private bool copyDllsToServer()
    {
        //string targetPath = @"\\" + remoteIpAddress + "\\" + userName + batchRunPath;
        string targetPath = "Z:\\nBatcher\\" + userName + batchRunPath;
        if (!Directory.Exists(targetPath))
            Directory.CreateDirectory(targetPath);
        else
        {
            Directory.Delete(targetPath, true);
            Directory.CreateDirectory(targetPath);
        }


        for (int i = 0; i < listOfFilesToCopy.Count; i++)
        {
            if (listOfPathToCopy[i].CompareTo(omekPath + shadersPath) == 0)
            {
                if (!Directory.Exists(targetPath + "Shaders"))
                    Directory.CreateDirectory(targetPath + "Shaders");
                if (!File.Exists(targetPath + "Shaders\\" + listOfFilesToCopy[i]))
                    File.Copy(listOfPathToCopy[i] + listOfFilesToCopy[i], targetPath + "Shaders\\" + listOfFilesToCopy[i], true);
            }
            else
            {
                if (!File.Exists(targetPath + listOfFilesToCopy[i]))
                    File.Copy(listOfPathToCopy[i] + listOfFilesToCopy[i], targetPath + listOfFilesToCopy[i], true);
            }

        }

        return true;
    }    

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

我会使用BackgroundWorker来实现这一点(基本上将一个线程池线程包装在一个很好的组件中以放在你的表单上,并使得对UI线程的编组更容易一些)。如果您愿意,还可以使用事件报告复制功能的进度。

请参阅此处获取有关MSDN的教程 - http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

我会提出一个警告。只在单个线程中执行激烈的文件操作,因为您可能会遇到使用并发线程的磁盘I / O问题。

答案 1 :(得分:0)

        var bg = new BackgroundWorker();
        bg.DoWork += (s1,e1) => copyDllsToServer();

        bg.RunWorkerAsync();