2014-02-27 4 views
0

에서 예외가 발생합니다 :DataTable을 내가 얻고, Parallel.ForEach

인덱스 범위를 벗어난 것입니다. 음수가 아니며 컬렉션의 크기가 보다 작아야합니다.

제발 도와주세요.

static void Main(string[] args) 
{ 
    DataTable dt = CreateTable(); 
    dt.Columns.Add("C"); 
    //Parallel.ForEach(Partitioner.Create(0, dt.Rows.Count), range => 
    //{ 
    // for (int j = range.Item1; j < range.Item2; j++) 
    // { 
    //   dt.Rows[j]["C"] = dt.Rows[j]["A"] + "-" + dt.Rows[j]["B"]; 
    // } 
    //}); 

    Parallel.ForEach(dt.AsEnumerable(), row => 
    { 
     row["C"] = row["A"] + "-" + row["B"];     
    }); 
} 

private static DataTable CreateTable() 
{ 
    DataTable dataTable = new DataTable(); 
    dataTable.Columns.Add("A"); 
    dataTable.Columns.Add("B"); 
    for (int i = 0; i < 100000; i++) 
    { 
     dataTable.Rows.Add("A" + i, "B" + i); 
    } 
    return dataTable; 
} 

답변

4

DataTable은 스레드로부터 안전하지 않습니다. 여러 업데이트를 병렬로 실행할 수 없습니다.

이 유형은 다중 스레드 읽기 작업에 안전합니다. 모든 쓰기 작업을 동기화해야합니다.