ADO.NET (ActiveX Data Object .NET)

スレッド セーフ

これらのクラスはマルチスレッドでの読み込み操作は安全ですが、書き込み操作では同期させなければなりません。

ただし読み込み操作であっても、内部で反復子が用いられているメソッドでは、対象のコレクションの追加や除去と同期させなければなりません。

Action select = () =>
{
    for (int i = 0; i < 1000; i++)
        table.Select(); // InvalidOperationException「コレクションが修正されました。列挙操作が実行されない可能性があります。」
};

Action add = () =>
{
    for (int i = 0; i < 1000; i++)
        table.Rows.Add();
};

Parallel.Invoke(select, add);

状況によってはInvalidOperationExceptionの説明が、「DataTable の内部インデックスが破損しています。'n' (DataTable internal index is corrupted: 'n'.)」となります。

Microsoft Learnから検索