我用到了两个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;
            }        }

解决方案 »

  1.   

    我说说自己的看法。两个Timer来讲的话,应该就是有两个线程吧。
    两个线程同时访问一个文件,会不会涉及到排队等候的问题?也就是说,一个线程访问的时候,锁住了这个资源,等其操作完,另外一个线程才能操作?
      

  2.   

    LZ的意思应该是同时复制2个文件吧
    最好是创建2个线程调用这个函数吧,直接用timer不知道行不行
      

  3.   


     timer不就是可以认为是线程吗?
      

  4.   

    这也叫多线程?楼主代码写的真喜感。
    临界区都没控制好,两个流还是在一个临界区里面,我都怀疑你是不是在两个timer里面调用 copyfile两次。
    而且根本就不该用timer 我不知道你是如何绑定、调用的。但timer一般是用来多次执行简单任务的。总之,楼主完全还对线程这玩意理解很模糊,还是多了解下吧。
    不要玩timer 先从thread玩起。
      

  5.   

    我是在两个time里分别调用了一次copyfile ,但是这样会有冲突吗?还有您说的临界区不是很明白,能详细解释下吗?
      

  6.   

    timer有多个,
    System.Windows.Forms.Timer是单线程的,也就是两个不会同时执行
    试试System.Threading.Timer
      

  7.   

    楼上正解,System.Windows.Forms.Timer只是UI线程的。
      

  8.   

    一共3个线程好吧, UI线程是主线程的,这个就是跨线程访问,
    楼主为什么用timer呢,  你就是做一个 复制文件的功能对吧,我觉得理理思路  1,2,3 可以解决
      

  9.   

    我是在两个time里分别调用了一次copyfile ,但是这样会有冲突吗?还有您说的临界区不是很明白,能详细解释下吗?
    两个time里分别调用了一次copyfile  
    果然如此 , 楼主肯定没学好计算机结构与组成和操作系统原理
    你这样子用,就是调用了4次复制, 一次copyfile两次复制至于临界区 这种概念性的东西 我讲的肯定没百度 google好。