0

当我将客户端连接到服务器时,客户端开始将一些 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;
    }    

有任何想法吗?

4

2 回答 2

4

我会为此使用 a BackgroundWorker(基本上将线程池线程包装在一个不错的组件中以放在您的表单上,并使编组到 UI 线程更容易一些)。如果您愿意,您还可以使用这些事件来报告复制功能的进度。

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

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

于 2013-01-31T14:44:26.547 回答
0
        var bg = new BackgroundWorker();
        bg.DoWork += (s1,e1) => copyDllsToServer();

        bg.RunWorkerAsync();
于 2013-01-31T23:37:54.357 回答