解决方案 »

  1.   

    CopyFiles();里的代码?没代码,谁知道你怎么调用的
      

  2.   


    public void CopyFiles(string token, IServer Server, AreaDataEntity DataEntity, IFile item, int move)
            {
    nResult = api.DocuManagement.CreateFile(token,
                            DataEntity.FolderId,
                            item.Name, item.Re, item.Code, item.ExtName, item.Type,
                            item.LevelId, item.Size, false, out ServerFile);
    }
      

  3.   

    线程里没有循环,都只执行一次?
    看看AreaList数组里有没有重复项
      

  4.   

    还有,你放的CopyFiles跟之前明显不是同一个
    不要随意简化代码再放出
    也许错误就在你简化了的地方
    除非你确定问题到底出在哪里不过你要是真的知道问题出在哪里,也不会来问了
      

  5.   

    前面就加了个文件是否已经存在在文件夹里的判断List<IFile> FileList;                api.DocumentManagement.GetChildFileList(token, DataEntity.ServerFolderId, out FileList);                bool isExists = false;                foreach (var File in FileList)
                    {
                        if (File.FileName == item.FileName)
                        {
                            isExists = true;
                        }
                    }
    if(isExists == false){nResult = api.DocuManagement.CreateFile(token,
                            DataEntity.FolderId,
                            item.Name, item.Re, item.Code, item.ExtName, item.Type,
                            item.LevelId, item.Size, false, out ServerFile);}
      

  6.   

    不建议在foreach里创建Thread,尝试用线程池或task        public void SyncDirectory()
            {
                foreach (var DataEntity in AreaList)
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(Sync), DataEntity);
                }
            }        string item = "item";
            private void Sync(object item)
            {
                lock (item)
                {
                    //把item即为DataEntity,作一下类型转换
                    DataEntity AreaDataEntity = (AreaDataEntity)item;
                    CopyFiles();
                }
            }
      

  7.   

    上面的代码有点问题,改一下  public void SyncDirectory()
            {
                foreach (var DataEntity in AreaList)
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(Sync), DataEntity);
                }
            }
     
            string item = "item";
            private void Sync(object o)
            {
                lock (item)
                {
                    //o即为DataEntity,作一下类型转换
                    DataEntity AreaDataEntity = (AreaDataEntity)item;
                    CopyFiles();
                }
            }
      

  8.   

    还是有问题,再改一下  public void SyncDirectory()
            {
                foreach (var DataEntity in AreaList)
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(Sync), DataEntity);
                }
            }
     
            string item = "item";
            private void Sync(object o)
            {
                lock (item)
                {
                    //o即为DataEntity
                    DataEntity AreaDataEntity = (AreaDataEntity)o;
                    CopyFiles();
                }
            }
      

  9.   

    foreach (var DataEntity in AreaList)
                {
                      var dataEntry = DataEntity;
                    ThreadPool.QueueUserWorkItem(new WaitCallback(Sync), dataEntry);
                }
      

  10.   

    是不是应该这样改啊
    private  void  Sync(object item)
            {
                lock (item)
                {
      

  11.   

    Thread thread = new Thread(new ParameterizedThreadStart(Sync)); 遍历的时候在lock里会调用一次
     
                    thread.Start(DataEntity);//首先这里会调用一次 DataEntity 类
    一共两次
      

  12.   


    不能这样写,因为每次传过来的item不一定是同一个对象,这样的话,加不加lock都是没有意义的
      

  13.   


    说明Sync方法同时被两个线程调用,所以就出现了你说的这种情况,其实还是线程锁的问题,如果锁的不是同一个对象,那么当然会出现同一方法在同一时刻被多个线程调用的情况
      

  14.   

    private void inet()
             {
                 for (int i = 0; i < 2; i++)
                 {
                     Thread thread = new Thread(new ParameterizedThreadStart(Ssync));                 thread.Start(new DataEntity());
                 }
             }
             private void Ssync(object item)
             {
                 lock (item)
                 {
                    new  DataEntity();             }
             }
             class   DataEntity
             {
                 private int i;
                 public DataEntity()
                 {
                     i++;
                 }
                 public int I
                 {
                     get { return i; }
                     set { i = value; }
                 }
             }
      

  15.   

     private void inet()
             {
                 for (int i = 0; i < 1; i++)
                 {
                     Thread thread = new Thread(new ThreadStart(A));
                     Thread threads = new Thread(new ParameterizedThreadStart(B));
                     threads.Start(thread);
                 }
             }
             private void B(object item)
             {
                 lock (item)
                 {
                     new DataEntity();
                 }
             }
             private void A()
             {
                
             }
             class   DataEntity
             {
                 private  int i;
                 public DataEntity()
                 {
                     i++;
                 }
                 public int I
                 {
                     get { return i; }
                     set { i = value; }
                 }
             }
      

  16.   

    我觉得:lock 参数对象,在这里好像没什么意义啊,问题可能出在多个线程同时调用了同一个对象,访问可能被拒绝,最好能把出现的错误再贴的详细点
      

  17.   

    api.DocuManagement.CreateFile很可能不是线程安全的,多线程调用时这个方法内部可能共享了部分内存,导致数据错误。
      

  18.   


    说明Sync方法同时被两个线程调用,所以就出现了你说的这种情况,其实还是线程锁的问题,如果锁的不是同一个对象,那么当然会出现同一方法在同一时刻被多个线程调用的情况private string item = "item";
            private  void  Sync(object o)
            {
                lock (item)
                {
                    DmsUnionAreaDataEntity unionAreaDataEntity = (DmsUnionAreaDataEntity)o;
    这样可以了吗?
      

  19.   

    CopyFiles 里面下个断点,然后看 CallStack 就知道了。
      

  20.   

     CopyFiles里面访问了非托管资源?
    楼主先把 CopyFiles 换成sleep看看,
    其实多线程又不能提高性能,不追求同步还不如自己用个list维护下.