Parallel.Foreach를 사용하여 Datatable의 인덱스 출력 범위 예외

c# datatable parallel.foreach parallel-processing sqlbulkcopy

문제

나는 그들의 역방향 DNS 매핑과 함께 하나의 열에 IP 주소를 가진 DataTable을 보강하려고 노력 중이다. 이 DataTable을 다른 곳에서 받고 있습니다. 그런 다음이 테이블을 SQLBulkcopy를 사용하여 SQL Server로 내 보냅니다.

두 개의 열을 추가합니다. 하나는 DNS 이름 용이고 다른 하나는 최상위 도메인 부분 전용입니다. 내가 많은 IP를 가지고 있고 역방향 DNS를 수행하면 각각에 대해 병렬을 사용하는 데 약간의 시간이 걸립니다. 이상하게도 NestedException 내에서 예측할 수없는 IndexOutOfRangeExceptions가 병렬 루프에 대해 발생합니다 (또는 데이터 테이블에서 clear을 호출 할 때 병렬 루프 외부에 있음). 왜?

내가하는 일이 여기에있다.

        //mapping specifies a mapping within the DataTable and the Database

        SqlBulkCopy copy = new SqlBulkCopy(cn);
        foreach (KeyValuePair<int, int> pair in mapping)
        {                                                                       
            copy.ColumnMappings.Add(pair.Key, pair.Value);
        }


        dt.Columns.Add("URL");
        dt.Columns.Add("Domain");
        solver.AddDNSInfo(dt, 1); //second row has the IP
        copy.WriteToServer(dt);
        dt.Clear();     //exceptions are thrown here   




    //ipIndex is the index within the datatable where the IP of interest is. 
    //In my scenario ipIndex=1
    public void AddDNSInfo(DataTable table, int ipIndex)
    {
        Parallel.ForEach(table.AsEnumerable(), row =>
        {
                string URL = GetDNSName((string)row[ipIndex]);
                row["URL"] = URL; //exceptions are thrown here
                row["Domain"] = GetTopLevelDomain(URL);
                Console.Write("*");
        });

수락 된 답변

DataTable 은 다중 스레드 쓰기 작업에 대해 스레드로부터 안전하지 않기 때문입니다.

MSDN 메시지 :

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

Parallel.ForEach 에서 동시에 여러 개의 스레드로 새로운 열을 작성하고 있습니다.

  row["URL"] = URL;
  row["Domain"] = GetTopLevelDomain(URL);

DataTable 쓰기 호출을 동기화해야합니다 (잠금 또는 일부 형식의 모니터 사용)



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.