В этом коде есть очевидная проблема - он никогда не ждет завершения задачи и завершает работу даже до ее запуска.
Нет ничего плохого в Task.Run, но он запускает другой поток.SqlClient предлагает истинные асинхронные методы, которые не занимают поток, просто чтобы заблокировать его во время ожидания.
Код можно переписать следующим образом:
static async Task RunSomeCommand(string connString)
{
try
{
using (var connection = new SqlConnection(connString))
{
var cmd=new SqlCommand(...);
await connection.OpenAsync();
await cmd.ExecuteNonQueryAsync();
}
}
catch (Exception ex)
{
console.writeLine("exception");
}
}
static async Task RunManyCommands()
{
var listOfConnections=new List<string>();
//Somehow load all connection strings
var tasks = from cn in listOfConnections
select RunSomeCommand(cn);
await Task.WhenAll(tasks);
}
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("Starting");
await RunManyCommands();
Console.WriteLine("Finished");
}
}
RunSomeCommand
открывает соединение и выполняет команду асинхронно.RunManyCommands
запускает несколько асинхронных операций и ожидает их завершения.Наконец Main
сам ожидает RunManyCommands
, чтобы закончить, прежде чем завершить