等待C#Constructor

时间:2015-10-17 09:14:06

标签: c# multithreading asynchronous async-await

假设: 我有一个管理用户存储的课程。现在在创建类时,我想确保索引是一个异步方法。目前我只是打电话给等待,但我感到不舒服,因为我有点担心悬挂线程等意外行为。

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();

还是更好的解决方案?

1 个答案:

答案 0 :(得分:3)

您指的是经典的SynchronizationContext死锁。只要CreateIndexesAsync不使用SynchronizationContext,这是非常不可能的,这是完全安全的。

研究ConfigureAwait做什么以及如何使用它。您当前的使用情况表明您对此不够了解。 task.ConfigureAwait(false);是无操作,因为它会创建一个新的TaskAwaiter并将其抛弃。