Task.run не работает для соединений с базой данных - PullRequest
0 голосов
/ 20 ноября 2018

Когда я использую Task.run (), консольное приложение автоматически останавливается при создании нового SqlConnection (), если я использую его нормально. Я не могу создать новое соединение в консольном приложении.

namespace ConsoleApplication1
 {
  class Program
  {
    static void Main(string[] args)
    {
       new Program().startTAsk();
    }

    public async void startTAsk()
    {
           List<Task> tasks = new List<Task>();
        for (int i = 0; i < 1; i++)
        {
            tasks.Add(Task.Run(() => this.connectDB()));
        }

        await Task.WhenAll(tasks);

    }

    public void connectDB()
    {
        string dbDynamicConnectionString = "Data Source=192.168.1.20;Initial Catalog=Test;Persist Security Info=True;User ID=Test;Password=Test";
        bool ret = false;
        SqlConnection connection = null;
        try
        {
            using (connection = new SqlConnection(dbDynamicConnectionString))
            {

                //connect to db
            }
        }
        catch (Exception ex)
        {
              console.writeLine("exception");
        }


    }
}

}

1 Ответ

0 голосов
/ 20 ноября 2018

В этом коде есть очевидная проблема - он никогда не ждет завершения задачи и завершает работу даже до ее запуска.

Нет ничего плохого в 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, чтобы закончить, прежде чем завершить

...