假设: 我有一个管理用户存储的课程。现在在创建类时,我想确保索引是一个异步方法。目前我只是打电话给等待,但我感到不舒服,因为我有点担心悬挂线程等意外行为。
public MongoUserStorage(IMongoDatabase database)
{
userCollection = database.GetCollection<MongoUser>("Users");
roleCollection = database.GetCollection<MongoUserRole>("UserRoles");
CreateIndexesAsync().Wait();
}
问题:
处理这个异步mehtod的最佳方法是什么? (我希望确保在实例化类之后索引存在)
只需:CreateIndexesAsync().Wait();
或
var task = CreateIndexesAsync();
task.ConfigureAwait(false);
task.Wait();
还是更好的解决方案?
答案 0 :(得分:3)
您指的是经典的SynchronizationContext
死锁。只要CreateIndexesAsync
不使用SynchronizationContext
,这是非常不可能的,这是完全安全的。
研究ConfigureAwait
做什么以及如何使用它。您当前的使用情况表明您对此不够了解。 task.ConfigureAwait(false);
是无操作,因为它会创建一个新的TaskAwaiter
并将其抛弃。