SQLiteを非同期で実装し、トランザクション処理中に非同期の処理を行うと、awaitで待機されない
SQLiteを非同期で実行できるよう「SQLiteAsyncConnection」を使った実装にし、
トランザクションを開始して、サーバと非同期通信を行って取得したデータをテーブルに格納するようなプログラムを組みました。
しかし実行してみると、非同期通信が終わるのを待たずに、トランザクションの処理を抜けてしまいました。
以下のようなコードが、期待通りに動きません。
Console.WriteLine("a"); await conn.RunInTransactionAsync(async (SQLiteConnection tran) => { Console.WriteLine("b"); await Task.Delay(5000); Console.WriteLine("c"); tran.Commit(); }); Console.WriteLine("d");
期待するのは「a→b→c→d」なのですが、実際の動きはDelayを待機せずに「a→b→d→c」のように動作しました。
調べたところ見つかったのが以下のサイトだけだったのですが、
SQLite.Netの制限として、トランザクション内での非同期処理はサポートされないようです。
試しにトランザクション内を同期処理にすると、期待通りに動作しました。
Console.WriteLine("a"); await conn.RunInTransactionAsync((SQLiteConnection tran) => { Console.WriteLine("b"); System.Threading.Thread.Sleep(11000); Console.WriteLine("c"); tran.Commit(); }); Console.WriteLine("d");
上記であれば期待通りに「a→b→c→d」で動作します。
使い方をちょっと工夫する必要がありますね。