C# Task.run不适用于数据库连接

C# Task.run不适用于数据库连接,c#,ado.net,task,task-parallel-library,console-application,C#,Ado.net,Task,Task Parallel Library,Console Application,当我使用Task.run()时,控制台应用程序会在创建新的SqlConnection()时自动停止, 如果我正常使用,它的工作很好我无法在控制台应用程序中创建新连接。 namespace ConsoleApplication1 { class Program { static void Main(string[] args) { new Program().startTAsk(); } public async void startTAs

当我使用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
{
班级计划
{
静态void Main(字符串[]参数)
{
新程序().startTAsk();
}
公共异步void startTAsk()
{
列表任务=新列表();
对于(int i=0;i<1;i++)
{
tasks.Add(Task.Run(()=>this.connectDB());
}
等待任务。何时(任务);
}
public-void-connectDB()
{
string dbDynamicConnectionString=“数据源=192.168.1.20;初始目录=测试;持久安全信息=真;用户ID=测试;密码=测试”;
bool-ret=假;
SqlConnection=null;
尝试
{
使用(connection=newsqlconnection(dbDynamicConnectionString))
{
//连接到数据库
}
}
捕获(例外情况除外)
{
控制台写入线(“例外”);
}
}
}

}

此代码有一个明显的问题-它从不等待任务完成并在任务开始之前退出

任务没有问题。开始时运行,但它确实会启动另一个线程。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");
   }
}
static async Task RunSomeCommand(string-connString)
{
尝试
{
使用(var连接=新的SqlConnection(connString))
{
var cmd=新的SqlCommand(…);
等待连接。OpenAsync();
wait cmd.ExecuteNonQueryAsync();
}
}
捕获(例外情况除外)
{
控制台写入线(“例外”);
}
}   
静态异步任务RunManyCommands()
{
var listOfConnections=新列表();
//以某种方式加载所有连接字符串
var tasks=来自连接列表中的cn
选择RunSomeCommand(cn);
等待任务。何时(任务);
}
班级计划
{
静态异步任务主(字符串[]args)
{
控制台写入线(“启动”);
等待RunManyCommand();
控制台。写入线(“完成”);
}
}

RunSomeCommand
打开连接并异步执行命令
RunManyCommands
启动多个异步操作,并等待所有操作完成。最后,
Main
本身在终止任务之前等待
RunManyCommands
完成。但是,您的代码在退出之前不会等待任务完成(甚至开始)。异步执行SQL命令是错误的,因为它不会引发任何异常。控制台应用程序退出。即使我使用wait,它也不起作用。NET有异步方法,如
SqlConnection.OpenAsync()
SqlCommand.ExecuteReaderAsync()
。在C#7+中可以有一个
async Task Main()
。我想知道上面场景中的代码为什么不工作,它不会在调试模式下抛出任何异常。
即使我使用wait
如何?代码是什么样子的?你在哪里用过Wait?在任务本身上还是在任务内部?代码不起作用,因为它不等待该任务完成,并且在调用task.RunTask.waitAll()后立即退出,也在工作,而不是等待task.WhenAll()并使main()方法异步