MAUIでiOSアプリの開発!

MAUIを使ったiOSアプリの開発についての技術的なメモです。

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」のように動作しました。


調べたところ見つかったのが以下のサイトだけだったのですが、

xamarin.forms - How to use SQLITE async extensions within a transaction in a Xamarin Forms PCL? - Stack Overflow

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」で動作します。


使い方をちょっと工夫する必要がありますね。