我用到了两个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;
} }
一下为文件流复制代码;当程序运行时,程序只执行其中的一个文件的复制,而另一个要等到第一个复制完成后才进行复制,但我用了两个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;
} }
两个线程同时访问一个文件,会不会涉及到排队等候的问题?也就是说,一个线程访问的时候,锁住了这个资源,等其操作完,另外一个线程才能操作?
最好是创建2个线程调用这个函数吧,直接用timer不知道行不行
timer不就是可以认为是线程吗?
临界区都没控制好,两个流还是在一个临界区里面,我都怀疑你是不是在两个timer里面调用 copyfile两次。
而且根本就不该用timer 我不知道你是如何绑定、调用的。但timer一般是用来多次执行简单任务的。总之,楼主完全还对线程这玩意理解很模糊,还是多了解下吧。
不要玩timer 先从thread玩起。
System.Windows.Forms.Timer是单线程的,也就是两个不会同时执行
试试System.Threading.Timer
楼主为什么用timer呢, 你就是做一个 复制文件的功能对吧,我觉得理理思路 1,2,3 可以解决
两个time里分别调用了一次copyfile
果然如此 , 楼主肯定没学好计算机结构与组成和操作系统原理
你这样子用,就是调用了4次复制, 一次copyfile两次复制至于临界区 这种概念性的东西 我讲的肯定没百度 google好。