2016-06-06 4 views
-1

У меня есть набор команд SQL, которые не возвращают запрос, а только количество затронутых записей. Они работают на разных серверах.Выполнять несколько одновременных SqlCommand.ExecuteNonQuery() и получать уведомления, когда они заканчиваются

Они могут работать одновременно, мне не нужно ждать один финиш, чтобы начать с другого. Я разрабатываю приложение C#, я хотел бы выполнить их все параллельно, а затем дождаться их завершения и получения их возвратов int.

Первой идеей является использование нескольких потоков. Я создаю поток для запуска каждого SqlCommand.ExecuteNonQuery(). Может быть, я создаю список bools, которые будут установлены в true, когда выполнение закончится. Затем, в основном потоке, я продолжаю проверять эти bools и спать, если какой-либо из них является ложным. Try-finally установил бы bool в true, даже если выбрано Exception.

Это лучшее решение? Может ли кто-нибудь подумать об этом лучше?

+0

['ExecuteNonQueryAsync()'] (https://msdn.microsoft.com/en-us/library/system.data.common.dbcommand.executenonqueryasync (v = vs.110) .aspx) + [Задача. WaitAll()] (http://stackoverflow.com/q/25009437/1997232). – Sinatr

+0

С какими проблемами вы сталкиваетесь с текущей реализацией? – niksofteng

+0

@ Think2ceCode1ce Вы имеете в виду идею, которую я предоставил? Я еще не реализовал его, я спрашиваю, лучший ли это или есть лучший. – Hikari

ответ

3

В зависимости от вашей версии .NET и среды, вы можете использовать асинхра ждут, что:

public static async Task ExecuteInParallel(SqlCommand[] commands) 
{ 
    var sqlTasks = commands.Select(c => ExecuteNonQueryAsync()); 
    await Task.WhenAll(sqlTasks); 
} 

Чтобы блокировать поток и ждать все команды, чтобы закончить:

Task.WhenAll(sqlTasks).Wait(); 

Примечания однако это блокировка may lead to a deadlock.

Чтобы асинхронно обрабатывать завершение, вы можете либо дождаться метода, либо использовать ContinueWith.

+0

Спасибо! попробуем это. В самом деле, я был бы более комфортным с функцией, которая вернется, если она уже запущена, и я сплю, чем функция, которая ждет. Но я полагаю, что запросы возвратят/выбросят Exception, когда настроены таймауты, правильно? – Hikari

Смежные вопросы