SQLite-Net-PCL死锁问题

时间:2017-06-03 21:26:17

标签: c# sqlite asynchronous xamarin xamarin.android

我正在使用带有Xamarin.Android的SQLite-PCL进行数据存储。我正在异步使用它,并因此而遇到死锁问题。

实现包含在DataHandler类中:

构造

public DataHandler(string path)
{
      _db = new SQLiteAsyncConnection(path);
      Initialize().Wait();
}

初始化功能

private async Task Initialize()
{
    using (await Lock())
    {
        await _db.CreateTableAsync<Person>();
        await _db.CreateTableAsync<Animal>();
    }
 }

最后,Lock()函数是这里问题的答案的实现:https://stackoverflow.com/a/44127898/3808312

构造对象时,第一次调用Initialize().Wait()时会调用CreateTableAsync()并发生死锁,不幸的是,我无法在不触及它的反汇编的情况下调试到库中。我使用异步模式错误还是什么?是的,我知道Wait()是同步的。这只是为了保持与类中其他方法相同的格式。

1 个答案:

答案 0 :(得分:2)

对于这样的问题,常见的模式是使用异步工厂方法创建受影响的类。

printf( "%p\n", (void *) *words );

然后以允许异步调用的方式使用它。

public class DataHandler {

    //...other code 

    private DataHandler() {

    }

    private async Task InitializeAsync(string path) {
        _db = new SQLiteAsyncConnection(path);
        using (await Lock()) {
            await _db.CreateTableAsync<Person>();
            await _db.CreateTableAsync<Animal>();
        }
    }

    public static async Task<DataHandler> CreateDataHandler(string path) {
        var handler = new DataHandler();
        await handler.InitializeAsync(path);
        return handler;
    }

    //...other code 
}

var handler = await DataHandler.CreateDataHandler("<path here>"); 虚拟方法中,您可以订阅页面/视图的OnAppearing事件

Appearing

并在实际的偶数处理程序上调用异步代码

protected override void OnAppearing() {
    this.Appearing += Page_Appearing;
}