2015-08-26 4 views
0

У меня есть функция, которая соединяется с несколькими экземплярами SQL-сервера для извлечения набора данных из каждого сервера для сравнения данных между несколькими средамиинстанцирование темы внутри цикла Еогеаспа в C#

У меня есть коллекция строки подключения Я называю этот метод в цикле Еогеаспа для каждой строки подключения в коллекции

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

+0

Что вы хотите делать с данными, которые вы получаете с разных серверов? – displayName

+0

Вы просто демпируете данные где-то после их получения с каждого сервера? – thewisegod

+0

Как вы планируете использовать данные? Кроме того, посмотрите, можете ли вы оптимизировать свои SQL-запросы (если это возможно). –

ответ

4

Есть несколько способов сделать это

1.) создать набор задач, а затем сделать «ждут Task.WaitAll (listOfTasks) "

2.) Использование Parallel.ForEach

3.) Управление нитей

управления потоками

Я делаю это в 2 этапа:

1.) Создание списка нитей

List<Thread> threads = new List<Thread>(); 
foreach(var connectionString in ConnectionStrings) 
{ 
    var thread = new Thread(DoWork); 
    thread.Start(connectionString); 
    threads.Add(thread); 

} 

2.) Регистрация нити для текущего потока, имеет эффект блокирование, пока все будут завершены ,

foreach(var thread in threads) 
{ 
    thread.Join() 
} 
1

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

// list of threads 
List<Thread> threads = new List<Thread>(); 

// list of the results for each thread 
List<SomeTypeDto> results = new List<SomeTypeDto>(); 

foreach(var connectionString in connectionStringList) { 

    // create the thread 
    Thread thread = new Thread(() => { 

     // access the database 

     SomeTypeDto result = /* process some result data*/; 

     lock (results) { 
      results.Add(result); 
     } 
    }); 

    threads.Add(thread); 
} 

// start all threads 
foreach (Thread thread in threads) { 
    thread.Start(); 
} 

// Wait for all the threads to finish 
foreach (Thread thread in threads) { 
    thread.Join(); 
} 
Смежные вопросы