2015-12-27 2 views
2

Я пытаюсь раздобыть ключевые слова и использование, и я думаю, что у меня есть основы. Но что-то не работает в моем коде 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 

ответ

1

После запуска асинхронных задач, как эта задача и основной поток может продолжать работать. Таким образом, нет гарантии, что она работает быстрее.

SQLite - это встроенная база данных без накладных расходов на клиент/сервер и, как библиотека, работает на одном процессоре. Таким образом, эта реализация могла бы решить, что фактически поддержка асинхронного выполнения не имеет смысла.

+0

Можете ли вы PLZ дать мне больше информации об этом? действительно, я не знал, почему это произошло. – FatemehEbrahimiNik

+0

* «как библиотека, работает на одном и том же процессоре *« Как именно гарантировано работать на одном и том же процессоре? управляемая библиотека не имеет такого контроля. –

+0

@YuvalItzchakov Нет гарантий. Но с точки зрения ОС, вызов функции в библиотеку не является поводом для изменения планирования этого процесса. (В SQL Server код базы данных всегда выполняется асинхронно на другом конце именованного канала.) –

Смежные вопросы