Я разрабатываю программу Windows Form C#, которая считывает данные Excel с общего диска каждые 20 минут (я использую «Таймер») - функция «вставка». Я хочу читать сразу несколько файлов Excel из-за производительности. По этой причине я использую потоки.Выполнение нескольких потоков
Каждый поток вызывает функцию (LoadExcelData), которая считывает данные из Excel в ArrayList. Я хочу знать, когда все потоки закончены (когда все файлы excel были загружены в ArrayList), чтобы вставить этот ArrayList во внутреннюю базу данных.
Я пробовал с нитью [i] .Join(), но это замерзает GUI. Я также не знаю, что произойдет, если у меня будет более 100 файлов и по этой причине более 100 потоков. Может ли это вызвать исключение памяти или какое-либо другое исключение?
//Execute every 20 minutes (Timer). Do not Execute in case previouse run is not finished
void inserting(List<String> excels){
int numOfThreads=excels.length;
Thread[] threads = new Thread[numOfThreads];
for (int index = 0; index < numOfThreads; index++)
{
int i = index;
threads[index] = new Thread(() =>
{
LoadExcelData(excels[i].File_name); //function loads excel data to global array "Weather" which is used later on
});
}
for (int i = 0; i < threads.Length; i++)
{
threads[i].Start(); //start thread
}
for (int i = 0; i < threads.Length; i++)
{
// threads[i].Join(); //this freezes GUI!
}
InsertToDB(object of ArrayList<ClassName>); //insert data which was read from Excels
isRunning=false;//Data was successefully inserted to DB
}
Я хочу запускать это каждые 20 минут. Я использую таймер:
timer = new System.Windows.Forms.Timer();
timer.Tick += new EventHandler(timerEventHanlder);
timer.Interval = 20 * 60000; // in miliseconds
timer.Start();
private void timerEventHanlder(object sender, EventArgs e)
{
List<String> excels = getExcels();
if (!isRunning){ //in case previous timer even is not finished wait another 20 minutes...
isRunning=true; //flag to true
inserting(excels);
}
}
Есть ли еще лучше подождать, чтобы решить вышеуказанную проблему?
Лично я почти никогда не использую нитки по причине производительности. Я использую их почти всегда, чтобы поддерживать пользовательский интерфейс. На самом деле, я думаю, что потоки _reduce_ производительность, из-за перекрестной связи связи и блокировки/синхронизации. –
С самого начала я делал это для одного и того же - GUI зависал. Но тогда мне нужно было знать, когда все потоки закончены из-за таймера, и я использовал событие thread.Join(), вызвавшее снова замораживание GUI. В моем случае производительность улучшилась, потому что два (или более) файла Excel обрабатываются быстрее. – michael24B