.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;
    }
}