2017-08-16 58 views
0

是 将表添加到数据集由多个线程是线程安全的?将表添加到数据集由多个线程是线程安全的?

List<Action> TestActions = new List<Action>(); 

    Action action1 = new Action(() => Method1(dsDataset)); 
    TestActions.Add(action1); 

    Action action2 = new Action(() => Method2(dsDataset)); 
    TestActions.Add(action2); 

    Action action3 = new Action(() => Method3(dsDataset)); 
    TestActions.Add(action3); 

    try 
    { 
     Parallel.ForEach(TestActions, (a) => a()); 
    } 

    Method1(DataSet ds) { 
    //excecute a db call and returns datatable 
    Datatable db ={database query} 
    ds.Tables.Add(db) 
    } 
      Method2(DataSet ds) { 
    //excecute a db call and returns datatable 
    Datatable db ={database query} 
    ds.Tables.Add(db) 
    } 
      Method3(DataSet ds) { 
    //excecute a db call and returns datatable 
    Datatable db ={database query} 
    ds.Tables.Add(db) 
    } 

是上述代码的工作原理或我需要锁当每个线程试图添加锁放在数据集? 有没有更好的办法可以做到?

回答

0

official documentation

这种类型是安全的多线程读取操作。您必须同步任何写入操作。

所以,答案是:不,它是不安全的。使用同步或在单个线程中添加表。
只是好奇,为什么你需要并行?

如果是由于某些工作需要并行完成,并且由于此工作需要将表添加到ds中,我可以重新使用一个ConcurrentQueue来存储表和一个工作线程,来自该队列的项目并将它们添加到ds。