Использование C#/.NET 3.5.
В настоящее время я заполняю 2 DataTables один за другим с помощью SqlDataAdapter. Заливка ().
Я хочу заполнить оба из этих DataTables параллельно, одновременно путем выполнения каждого асинхронно. Однако нет никакой асинхронной версии Заливки (), метод - т.е. BeginFill () был бы замечательным!
Один подход, который я попробовал (псевдо):
Однако DataTable. Загрузка () занимает много времени:
Требуется 3 секунды, чтобы сделать шаг 1 к шагу 4.
Шаг 5 затем занимает 22 секунды.
Шаг 6 занимает 17 секунд.
Так, объединил 39 секунд для шагов 5 и 6.
Конечный результат, это не приносит мне пользы просто выполнение 2 SqlDataAdapter. Заливки, один за другим. Я хочу конечный результат быть, что весь процесс берет только пока самый долгий запрос (или максимально близко к этому).
Поиск рекомендуемых путей вперед для окончания с чем-то, что является действительно асинхронным подходом к заполнению DataTable.
Или я просто управляю им сам и прокручиваю 2 отдельных потока, каждый заполняющий DataTable?
Я бы предложил иметь отдельный рабочей нити для каждого. Вы могли бы использовать 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());
Оба
#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);
}