Я пытаюсь раздобыть ключевые слова и использование, и я думаю, что у меня есть основы. Но что-то не работает в моем коде SQLite.Использование SQLite с async в C#
Я использую SQLite.core NuGet package в простом проекте, над которым я работаю. Я заметил, что асинхронный код, который я написал, не ведет себя асинхронно (как я и ожидал), поэтому я создал более простой тестовый проект, чтобы проверить свое понимание.
В моем тестовом коде я открываю соединение с базой данных в памяти (у меня такая же проблема с файловой базой данных. В памяти было просто проще в тестовом коде) и выпустить один «создать» table ", используя ExecuteNonQueryAsync
. Я не сразу await
для результата, но вместо этого напишу что-то на консоль, прежде чем, наконец, использовать ключевое слово await
.
Я ожидаю, что консольная команда будет выполнена до завершения ExecuteNonQueryAsync
, поэтому в моем тесте я должен увидеть «1 2 3 4». Но вместо этого я получаю «1 3 2 4»
Я запускаю идентичный тест с использованием соединения SQL Server LocalDB (с тем же кодом, только DbConnection
) и получить ожидаемый «1 2 3 4». Поэтому, я думаю, мое основное понимание async
не так уж далека от знака.
Что мне не хватает? Нужно ли использовать специальную строку соединения с SQLite для поддержки методов async
? Поддерживает ли он это?
Мой полный тестовый проект можно найти here.
А вот основная программа сама:
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
Можете ли вы PLZ дать мне больше информации об этом? действительно, я не знал, почему это произошло. – FatemehEbrahimiNik
* «как библиотека, работает на одном и том же процессоре *« Как именно гарантировано работать на одном и том же процессоре? управляемая библиотека не имеет такого контроля. –
@YuvalItzchakov Нет гарантий. Но с точки зрения ОС, вызов функции в библиотеку не является поводом для изменения планирования этого процесса. (В SQL Server код базы данных всегда выполняется асинхронно на другом конце именованного канала.) –