Блокировка параллелизма DataTable - PullRequest
2 голосов
/ 05 октября 2010

Я помогаю усовершенствовать приложение, и оно полно проблем параллелизма.Я пытаюсь проработать их и наткнулся на раздел, в котором используются DataTables.

Сам набор данных является статическим, общим для многих потоков.

Я знаю, что с помощью dt.Select ("... ") самому нужен оператор блокировки, иначе у вас возникнут проблемы при добавлении / удалении строк в таблицу данных.Однако, когда этот вызов возвращается, у вас есть массив объектов DataRow.

Я бы, очевидно, заблокировал эти строки, если бы обновил их, но если я просто читаю их, нужно ли им блокировать?

В принципе, учитывая, что в другом месте мы добавляем новыестроки и, возможно, обновление существующих строк, какие из них являются правильными:

lock (dtLock)
{
    DataRow[] rows = dt.Select("...");
}
foreach(DataRow dr in rows)
{
    // read statements only
}

или

lock (dtLock)
{
    DataRow[] rows = dt.Select("...");

    foreach(DataRow dr in rows)
    {
        // read statements only
    }
}

1 Ответ

1 голос
/ 05 октября 2010

Поскольку вы заявили, что будете обновлять существующие строки, у вас нет другого выбора, кроме как заблокировать доступ к строкам, которые вы извлекаете из Select. Вы не можете (или, по крайней мере, не должны) получать доступ к строкам, даже просто к чтению, если есть вероятность, что они могут быть изменены другим потоком. Более того, вполне возможно (и я сам видел доказательство в порядке исключения), что доступ к отдельной строке может коснуться внутренней структуры DataTable, поэтому даже если вы просто добавляете новые строки, может быть проблемой. .

...