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; } } }
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; } } }
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);
}
看看AreaList数组里有没有重复项
不要随意简化代码再放出
也许错误就在你简化了的地方
除非你确定问题到底出在哪里不过你要是真的知道问题出在哪里,也不会来问了
{
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);}
{
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();
}
}
{
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();
}
}
{
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();
}
}
{
var dataEntry = DataEntity;
ThreadPool.QueueUserWorkItem(new WaitCallback(Sync), dataEntry);
}
private void Sync(object item)
{
lock (item)
{
thread.Start(DataEntity);//首先这里会调用一次 DataEntity 类
一共两次
不能这样写,因为每次传过来的item不一定是同一个对象,这样的话,加不加lock都是没有意义的
说明Sync方法同时被两个线程调用,所以就出现了你说的这种情况,其实还是线程锁的问题,如果锁的不是同一个对象,那么当然会出现同一方法在同一时刻被多个线程调用的情况
{
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; }
}
}
{
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; }
}
}
说明Sync方法同时被两个线程调用,所以就出现了你说的这种情况,其实还是线程锁的问题,如果锁的不是同一个对象,那么当然会出现同一方法在同一时刻被多个线程调用的情况private string item = "item";
private void Sync(object o)
{
lock (item)
{
DmsUnionAreaDataEntity unionAreaDataEntity = (DmsUnionAreaDataEntity)o;
这样可以了吗?
楼主先把 CopyFiles 换成sleep看看,
其实多线程又不能提高性能,不追求同步还不如自己用个list维护下.