c# 多线程复制文件 堵塞问题

fengxingxiake 2013-05-23 01:44:53
我用到了两个timer控件,分两个线程进行文件复制:
一下为文件流复制代码;当程序运行时,程序只执行其中的一个文件的复制,而另一个要等到第一个复制完成后才进行复制,但我用了两个timer来调用copyfile函数,求教~~~~

/// <summary>
/// 文件流复制
/// </summary>
/// <param name="filefrom">源文件</param>
/// <param name="fileto">目标文件</param>
/// <param name="dir"></param>
/// <returns>复制是否成功</returns>
public bool copyfile(string filefrom, string fileto,int i)
{
FileStream fs1 = new FileStream(filefrom, FileMode.Open, FileAccess.Read);

FileStream fs2 = new FileStream(fileto, FileMode.Create, FileAccess.Write);
long size = 0;
long total = 0;
long size1 = 10240;
int size2 = 10240;
byte[] by = new byte[size2];
int k = 0;
int m = 0;
// int P_k = 0;
// int P_m = 0;
try
{
// timer5.Enabled = true;
while (size <= (fs1.Length - size1))
{
total = fs1.Read(by, 0, size2);
fs1.Flush();
fs2.Write(by, 0, size2);
fs2.Flush();
fs2.Position = fs1.Position;
if (m >= 50)
{
m = 0;
}
if (k > 100)
{
k = 0;
}
this.proess_value(i,k);
m++;
k++;
size += total;
textBox91.Text = i.ToString();
}
int left = (int)(fs1.Length - size);
total = fs1.Read(by, 0, left);
fs1.Flush();
fs2.Write(by, 0, left);
fs2.Flush();
fs1.Dispose();
fs2.Dispose();
fs1.Close();
fs2.Close();
return true;
}
catch
{
//progressBar16.Value = 0;
File.Delete(fileto);
fs1.Flush();
fs2.Flush();
fs1.Dispose();
fs2.Dispose();
fs1.Close();
fs2.Close();
return false;
}

}
...全文
369 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 8 楼 fengxingxiake 的回复:
[quote=引用 7 楼 sj178220709 的回复:] 这也叫多线程?楼主代码写的真喜感。 临界区都没控制好,两个流还是在一个临界区里面,我都怀疑你是不是在两个timer里面调用 copyfile两次。 而且根本就不该用timer 我不知道你是如何绑定、调用的。但timer一般是用来多次执行简单任务的。 总之,楼主完全还对线程这玩意理解很模糊,还是多了解下吧。 不要玩timer 先从thread玩起。
我是在两个time里分别调用了一次copyfile ,但是这样会有冲突吗?还有您说的临界区不是很明白,能详细解释下吗?[/quote] 两个time里分别调用了一次copyfile 果然如此 , 楼主肯定没学好计算机结构与组成和操作系统原理 你这样子用,就是调用了4次复制, 一次copyfile两次复制 至于临界区 这种概念性的东西 我讲的肯定没百度 google好。
skydhx 2013-05-29
  • 打赏
  • 举报
回复
一共3个线程好吧, UI线程是主线程的,这个就是跨线程访问, 楼主为什么用timer呢, 你就是做一个 复制文件的功能对吧, 我觉得理理思路 1,2,3 可以解决
535cheng110 2013-05-29
  • 打赏
  • 举报
回复
楼上正解,System.Windows.Forms.Timer只是UI线程的。
human_2000 2013-05-29
  • 打赏
  • 举报
回复
timer有多个, System.Windows.Forms.Timer是单线程的,也就是两个不会同时执行 试试System.Threading.Timer
fengxingxiake 2013-05-29
  • 打赏
  • 举报
回复
引用 7 楼 sj178220709 的回复:
这也叫多线程?楼主代码写的真喜感。 临界区都没控制好,两个流还是在一个临界区里面,我都怀疑你是不是在两个timer里面调用 copyfile两次。 而且根本就不该用timer 我不知道你是如何绑定、调用的。但timer一般是用来多次执行简单任务的。 总之,楼主完全还对线程这玩意理解很模糊,还是多了解下吧。 不要玩timer 先从thread玩起。
我是在两个time里分别调用了一次copyfile ,但是这样会有冲突吗?还有您说的临界区不是很明白,能详细解释下吗?
  • 打赏
  • 举报
回复
这也叫多线程?楼主代码写的真喜感。 临界区都没控制好,两个流还是在一个临界区里面,我都怀疑你是不是在两个timer里面调用 copyfile两次。 而且根本就不该用timer 我不知道你是如何绑定、调用的。但timer一般是用来多次执行简单任务的。 总之,楼主完全还对线程这玩意理解很模糊,还是多了解下吧。 不要玩timer 先从thread玩起。
fengxingxiake 2013-05-27
  • 打赏
  • 举报
回复
引用 4 楼 dixh1989 的回复:
LZ的意思应该是同时复制2个文件吧。。。 最好是创建2个线程调用这个函数吧,直接用timer不知道行不行。。。
timer不就是可以认为是线程吗?
fengxingxiake 2013-05-27
  • 打赏
  • 举报
回复
引用 1 楼 fengxingxiake 的回复:
自己顶下,在线求大神啊,,,,,
不是两个线程访问同一个文件,而是两个线程分别复制两个U盘里的不同数据
是_这样吗 2013-05-23
  • 打赏
  • 举报
回复
LZ的意思应该是同时复制2个文件吧。。。 最好是创建2个线程调用这个函数吧,直接用timer不知道行不行。。。
viki117 2013-05-23
  • 打赏
  • 举报
回复
这种情况,用队列来存储任务信息,用信号量来控制线程的并发数量就可以了~~
孙大诚_SunRobin 2013-05-23
  • 打赏
  • 举报
回复
我说说自己的看法。两个Timer来讲的话,应该就是有两个线程吧。 两个线程同时访问一个文件,会不会涉及到排队等候的问题?也就是说,一个线程访问的时候,锁住了这个资源,等其操作完,另外一个线程才能操作?
fengxingxiake 2013-05-23
  • 打赏
  • 举报
回复
自己顶下,在线求大神啊,,,,,
java,c/c++,php,c#安全编码规范,从代码层面避免被入侵 1 业务安全编码规范 6 1.1 输入验证和数据合法性校验 6 1.1.1 避免SQL注入 6 1.1.2 避免XML注入 6 1.1.3 避免跨站点脚本(XSS) 7 1.1.4 避免跨站请求伪造(CSRF) 8 1.1.5 避免敏感信息泄露 12 1.2 安全框架 12 1.2.1 Apache Shiro安全框架 12 1.2.2 webSecrity安全框架 13 1.2.3 Enterprise Security API 13 2 基础安全编码规范 15 2.1 声明和初始化 15 2.1.1 避免类初始化的相互依赖 15 2.2 表达式 16 2.2.1 不可忽略方法的返回值 16 2.2.2 不要引用空指针 16 2.2.3 使用Arrays.equals()来比较数组的内容 16 2.3 数字类型和操作 17 2.3.1 防止整数溢出 17 2.3.2 避免除法和取模运算分母为零 18 2.4 类和方法操作 18 2.4.1 数据成员声明为私有,提供可访问的包装方法 18 2.4.2 敏感类不允许复制 18 2.4.3 比较类的正确做法 19 2.4.4 不要硬编码敏感信息 19 2.4.5 验证方法参数 19 2.4.6 不要使用过时、陈旧或低效的方法 20 2.4.7 数组引用问题 20 2.4.8 不要产生内存泄露 20 2.5 异常处理 21 2.5.1 不要忽略捕获的异常 21 2.5.2 不允许暴露异常的敏感信息 21 2.5.3 不允许抛出RuntimeException, Exception,Throwable 22 2.6 多线程编程 23 2.6.1 确保共享变量的可见性 23 2.6.2 确保共享变量的操作是原子的 24 2.6.3 不要调用Thread.run(),不要使用Thread.stop()以终止线程 26 2.6.4 确保执行阻塞操作的线程可以终止 26 2.6.5 相互依存的任务不要在一个有限的线程池执行 27 2.7 输入输出 27 2.7.1 程序终止前删除临时文件 27 2.7.2 检测和处理文件相关的错误 27 2.7.3 及时释放资源 27 2.8 序列化 28 2.8.1 不要序列化未加密的敏感数据 28 2.8.2 在序列化过程中避免内存和资源泄漏 29 3 其他参考资料 30

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧