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