.Result() 使方法挂起时如何在构造函数中使用异步方法?
How to use asynchronous method in constructor when .Result() makes the method hang?
当页面出现在我的 Xamarin.Forms 项目中时,我有一个 AppearingCommand 调用,它最终执行以下 sqlite-net-pcl 行:(我已经有一个处理加载时间的机制)
AppearingCommand = new Command( async() => {
//...
var data = await db.Table<PlantCategory>().ToListAsync();
//...
}
我想把这个方法移到构造函数中,但是我做不到,因为如果同步执行它会挂起:
ctor() {
//...
var data = db.Table<PlantCategory>().ToListAsync().Result;
//...
}
该行从不 returns(我猜是因为死锁或其他原因)。
如果我想在构造函数中执行这一行,我还有哪些其他选择?
简单。不要。
相反,添加一个 post 构造方法,如 async ValueTask InitAsync()
并使用 await
调用它。
您可以将其隐藏在您调用 而不是 new Whatever(...)
的 static ValueTask<Whatever> CreateAsync(...)
方法后面,即
class Whatever {
private Whatever(...) { ... } // basic ctor
private async ValueTask InitAsync(...) { ... } // async part of ctor
public static async ValueTask<Whatever> CreateAsync(...) {
var obj = new Whatever(...);
await obj.InitAsync(...);
return obj;
}
}
当页面出现在我的 Xamarin.Forms 项目中时,我有一个 AppearingCommand 调用,它最终执行以下 sqlite-net-pcl 行:(我已经有一个处理加载时间的机制)
AppearingCommand = new Command( async() => {
//...
var data = await db.Table<PlantCategory>().ToListAsync();
//...
}
我想把这个方法移到构造函数中,但是我做不到,因为如果同步执行它会挂起:
ctor() {
//...
var data = db.Table<PlantCategory>().ToListAsync().Result;
//...
}
该行从不 returns(我猜是因为死锁或其他原因)。 如果我想在构造函数中执行这一行,我还有哪些其他选择?
简单。不要。
相反,添加一个 post 构造方法,如 async ValueTask InitAsync()
并使用 await
调用它。
您可以将其隐藏在您调用 而不是 new Whatever(...)
的 static ValueTask<Whatever> CreateAsync(...)
方法后面,即
class Whatever {
private Whatever(...) { ... } // basic ctor
private async ValueTask InitAsync(...) { ... } // async part of ctor
public static async ValueTask<Whatever> CreateAsync(...) {
var obj = new Whatever(...);
await obj.InitAsync(...);
return obj;
}
}