SqlDataAdapter. Заливка - Асинхронный подход

Использование C#/.NET 3.5.

В настоящее время я заполняю 2 DataTables один за другим с помощью SqlDataAdapter. Заливка ().

Я хочу заполнить оба из этих DataTables параллельно, одновременно путем выполнения каждого асинхронно. Однако нет никакой асинхронной версии Заливки (), метод - т.е. BeginFill () был бы замечательным!

Один подход, который я попробовал (псевдо):

  1. SqlCommand1. BeginExecuteReader//1-й запрос, для DataTable1
  2. SqlCommand2. BeginExecuteReader//2-й запрос, для DataTable2
  3. SqlCommand1. EndExecuteReader
  4. SqlCommand2. EndExecuteReader
  5. DataTable1. Загрузка (DataReader1)
  6. DataTable2. Загрузка (DataReader2)

Однако DataTable. Загрузка () занимает много времени:
Требуется 3 секунды, чтобы сделать шаг 1 к шагу 4.
Шаг 5 затем занимает 22 секунды.
Шаг 6 занимает 17 секунд.
Так, объединил 39 секунд для шагов 5 и 6.

Конечный результат, это не приносит мне пользы просто выполнение 2 SqlDataAdapter. Заливки, один за другим. Я хочу конечный результат быть, что весь процесс берет только пока самый долгий запрос (или максимально близко к этому).

Поиск рекомендуемых путей вперед для окончания с чем-то, что является действительно асинхронным подходом к заполнению DataTable.

Или я просто управляю им сам и прокручиваю 2 отдельных потока, каждый заполняющий DataTable?

8
задан AdaTheDev 21 January 2010 в 11:50
поделиться

2 ответа

Я бы предложил иметь отдельный рабочей нити для каждого. Вы могли бы использовать ThreadPool.QueueUserWorkitem .

List<AutoResetEvent> events = new List<AutoResetEvent>();

AutoResetEvent loadTable1 = new AutoResetEvent(false);
events.Add(loadTable1);
ThreadPool.QueueUserWorkItem(delegate 
{ 
     SqlCommand1.BeginExecuteReader;
     SqlCommand1.EndExecuteReader;
     DataTable1.Load(DataReader1);
     loadTable1.Set();
});

AutoResetEvent loadTable2 = new AutoResetEvent(false);
events.Add(loadTable2);
ThreadPool.QueueUserWorkItem(delegate 
{ 
     SqlCommand2.BeginExecuteReader;
     SqlCommand2.EndExecuteReader;
     DataTable2.Load(DataReader2);
     loadTable2.Set();
});

// wait until both tables have loaded.
WaitHandle.WaitAll(events.ToArray());
5
ответ дан 5 December 2019 в 22:18
поделиться

Оба

#include <irrlicht.h> 

#include "irrlicht.h" 

должны работать до тех пор, пока аргумент «-i» для GCC включает путь каталога, заключающего файл заголовка. Если IRRICHT.H является частью / usr / включает опцию "-i" больше не требуется.

-121--3866322-

Это связано с тем, что DataTable имеет много объектов для создания (строк, значений). Вы должны иметь выполнение адаптера и популяции дата, все сделанные в другом потоке, и синхронизируйте ожидание каждой операции, чтобы закончить, прежде чем продолжить.

Следующий код был написан в блокноте и, вероятно, даже не скомпилируется, но, надеюсь, вы получите идею ...

// Setup state as a parameter object containing a table and adapter to use to populate that table here

void DoWork()
{
    List<AutoResetEvent> signals = GetNumberOfWaitHandles(2);

    var params1 = new DataWorkerParameters
        {
            Command = GetCommand1();
            Table = new DataTable();
        }

    var params2 = new DataWorkerParameters
        {
            Command = GetCommand2();
            Table = new DataTable();
        }

    ThreadPool.QueueUserWorkItem(state => 
        {
            var input = (DataWorkerParameters)state;
            PopulateTable(input);
            input.AutoResetEvent.Set(); // You can use AutoResetEvent.WaitAll() in the caller to wait for all threads to complete
        },
        params1
    );

    ThreadPool.QueueUserWorkItem(state => 
        {
            var input = (DataWorkerParameters)state;
            PopulateTable(input);
            input.AutoResetEvent.Set(); // You can use AutoResetEvent.WaitAll() in the caller to wait for all threads to complete
        },
        params2
    );

    WaitHandle.WaitAll(signals.ToArray());
}


void PopulateTable(DataWorkerParameters parameters)
{
    input.Command.ExecuteReader();
    input.Table.Load(input.Command);
}
1
ответ дан 5 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: