Использование C#/.NET 3.5.SqlDataAdapter.Fill - Асинхронный подход
В настоящее время я заполняю 2 DataTables один за другим, используя SqlDataAdapter.Fill().
Я хочу заполнить обе эти DataTables параллельно, в то же время, делая асинхронно каждый. Тем не менее, нет асинхронной версии метода Fill(), то есть BeginFill() было бы здорово!
Один подход, который я попробовал это (псевдо):
- SqlCommand1.BeginExecuteReader // первый запрос, для DataTable1
- SqlCommand2.BeginExecuteReader // второй запрос, для DataTable2
- SqlCommand1.EndExecuteReader
- SqlCommand2.EndExecuteReader
- DataTable1.Load (DataReader1)
- DataTable2.Load (DataReader2)
Однако DataTable.Load() занимает много времени:
Это занимает 3 секунды, чтобы сделать шаг 1 к шагу 4. Шаг
5 затем занимает 22 секунд.
Шаг 6 занимает 17 секунд.
Итак, в общей сложности 39 секунд для этапов 5 и 6.
Конечный результат: это не дает мне никакой пользы от того, как просто сделать 2 SqlDataAdapter.Fills, один за другим. Я хочу, чтобы чистый результат состоял в том, что весь процесс занимает всего до самого длинного запроса (или как можно ближе к нему).
Ищите рекомендуемые способы продвижения в конечном итоге с чем-то, что действительно является асинхронным подходом к заполнению DataTable.
Или я сам справляюсь с этим сам и рулон 2 отдельных потока, каждый из которых заполняет DataTable?
Поэтому, как только я в очереди каждый один вверх, как не могу ждать, пока оба завершили? Мне нужно, чтобы обе таблицы были заполнены до того, как я смогу продолжить и обработать их. – AdaTheDev
Я добавил концепцию ожидания к моему ответу, если это поможет. –
@AdaTheDev, вы должны использовать AutoResetEvents, который вы запускаете после завершения работы (внутри каждого отдельного потока). См. @Neils ответ, поскольку он уже представил пример. – James