2017-08-16 36 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。