我正在努力理解
我在一个简单的项目中使用SQLite.core NuGet package。我注意到我编写的异步代码并没有像我预期的那样异步执行,因此我创建了一个更简单的测试项目来测试我的理解。
在我的测试代码中,我打开一个连接到内存数据库(我在基于文件的数据库中遇到了同样的问题。在测试代码中,内存更容易),然后发出一个单独的“create table”命令,使用
我希望在
我使用 SQL Server LocalDB 连接运行了一个相同的测试(运行相同的代码,只是
我错过了什么?我需要使用特殊的连接字符串来支持 SQLite 的
我的完整测试项目可以在 这里 找到。
以下是主程序:
async
/await
关键字和用法,我认为我已经掌握了基础知识。但是我的SQLite代码出了些问题。我在一个简单的项目中使用SQLite.core NuGet package。我注意到我编写的异步代码并没有像我预期的那样异步执行,因此我创建了一个更简单的测试项目来测试我的理解。
在我的测试代码中,我打开一个连接到内存数据库(我在基于文件的数据库中遇到了同样的问题。在测试代码中,内存更容易),然后发出一个单独的“create table”命令,使用
ExecuteNonQueryAsync
。我不会立即await
结果,而是先将一些内容写入控制台,最后再使用await
关键字。我希望在
ExecuteNonQueryAsync
完成之前执行控制台命令,因此在我的测试中,我应该看到“1 2 3 4”。但是我得到的却是“1 3 2 4”。我使用 SQL Server LocalDB 连接运行了一个相同的测试(运行相同的代码,只是
DbConnection
不同),得到了预期的 "1 2 3 4"。所以我猜我的 async
的基本理解并没有太远离正确的方向。我错过了什么?我需要使用特殊的连接字符串来支持 SQLite 的
async
方法吗?它是否支持?我的完整测试项目可以在 这里 找到。
以下是主程序:
namespace DatabaseTest
{
using System;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SQLite;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
Task.WaitAll(TestDatabase(true), TestDatabase(false));
}
private static async Task TestDatabase(bool sqLite)
{
Console.WriteLine("Testing database, sqLite: {0}", sqLite);
using (var connection = CreateConnection(sqLite))
{
connection.Open();
var task = ExecuteNonQueryAsync(connection);
Console.WriteLine("2");
await task;
Console.WriteLine("4");
}
}
private static DbConnection CreateConnection(bool sqLite)
{
return sqLite ?
(DbConnection)new SQLiteConnection(string.Format("Data Source=:memory:;")) :
new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\DatabaseTest.mdf;Integrated Security=True;Connect Timeout=30");
}
private static async Task ExecuteNonQueryAsync(DbConnection connection)
{
var command = connection.CreateCommand();
command.CommandText = "CREATE TABLE test (col1 integer);";
Console.WriteLine("1");
await command.ExecuteNonQueryAsync();
Console.WriteLine("3");
}
}
输出结果:
Testing database, sqLite: True
1
3
2
4
Testing database, sqLite: False
1
2
3
4
ExecuteReaderAsync
返回一个DbDataReader
。 - hossMicrosoft.Data.Sqlite
实现一样,异步 ADO.NET 方法会同步执行。https://learn.microsoft.com/en-us/dotnet/standard/data/sqlite/async - apdevelop