我正在使用带有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()是同步的。这只是为了保持与类中其他方法相同的格式。
答案 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;
}