C# 在后台复制文件

C# 在后台复制文件,c#,winforms,multithreading,client-server,C#,Winforms,Multithreading,Client Server,当我将客户端连接到服务器时,客户端开始将一些dll文件复制到服务器。 当这种情况发生时,表单会被卡住,直到复制完成(有一些大文件) 我希望在后台运行此副本,因为我希望用户能够继续与表单交互(打开一些浏览对话框等) 我会确保复印完成 我想线程在这里会有所帮助,但我对线程还不熟悉,我也不确定这是不是一种方法 以下是复制dll文件的代码: private bool copyDllsToServer() { //string targetPath = @"\\" + rem

当我将客户端连接到服务器时,客户端开始将一些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;
    }    
private bool copyDllsToServer()
{
//字符串targetPath=@“\\”+remoteIpAddress+“\\”+userName+batchRunPath;
string targetPath=“Z:\\nBatcher\\”+用户名+批运行路径;
如果(!Directory.Exists(targetPath))
目录.CreateDirectory(targetPath);
其他的
{
Directory.Delete(targetPath,true);
目录.CreateDirectory(targetPath);
}
for(int i=0;i

有什么想法吗?

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

有关MSDN的教程,请参见此处-


不过我要提醒你一点。只在一个线程中执行密集的文件操作,因为使用并发线程可能会遇到磁盘I/O问题。

为此,我将使用
BackgroundWorker
(基本上是将线程池线程包装在一个漂亮的组件中,放在表单上,使编组到UI线程变得更容易)。如果愿意,还可以使用事件报告复制功能的进度

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

        bg.RunWorkerAsync();
有关MSDN的教程,请参见此处-


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

您好,很抱歉响应太晚,我们今天才开始工作。写
(s,e)
我想你指的是这两个:
对象发送者,EventArgs e
对吗?嗯,我对c#有点陌生,仍然不熟悉它的所有语法,所以这一个对我来说是新的。通过编写您所做的,我在
sender
e
上都得到了以下错误:
名为“sender”的局部变量不能在此范围内声明,因为它将赋予“sender”不同的含义,而“sender”已在“父或当前”范围内用于表示其他内容。我应该做什么改变?我给了你现成的解决方案。你应该复制/粘贴我的代码。在发布到这里之前,我编译并运行了它。。(虽然您必须确保在您放置此代码的方法之前,名称不会在任何地方使用-因此我更改为s1 e1,以防您已经有s或e[不是发件人等])您好,很抱歉响应太晚,我们今天才开始工作。写
(s,e)
我想你指的是这两个:
对象发送者,EventArgs e
对吗?嗯,我对c#有点陌生,仍然不熟悉它的所有语法,所以这一个对我来说是新的。通过编写您所做的,我在
sender
e
上都得到了以下错误:
名为“sender”的局部变量不能在此范围内声明,因为它将赋予“sender”不同的含义,而“sender”已在“父或当前”范围内用于表示其他内容。我应该做什么改变?我给了你现成的解决方案。你应该复制/粘贴我的代码。在发布到这里之前,我编译并运行了它。。(尽管您必须确保在您放置此代码的方法之前,名称不会在任何地方使用-因此我将其更改为s1 e1,以防您已经有s或e[不是发件人等])
        var bg = new BackgroundWorker();
        bg.DoWork += (s1,e1) => copyDllsToServer();

        bg.RunWorkerAsync();