2015-10-17 41 views
1

鑑於: 我有一個類管理用戶存儲。現在創建類時,我想確保索引是異步方法。目前我只是打電話等待,但我不舒服,因爲我有點擔心掛起線程等意外行爲。等待C#構造函數中的異步方法

public MongoUserStorage(IMongoDatabase database) 
{ 
    userCollection = database.GetCollection<MongoUser>("Users"); 
    roleCollection = database.GetCollection<MongoUserRole>("UserRoles"); 

    CreateIndexesAsync().Wait(); 
} 

問:

什麼是處理這個asynchous mehtod最好的方法? (我想肯定的是,指標存在的類實例化後)

只要做到:CreateIndexesAsync().Wait();

var task = CreateIndexesAsync(); 
task.ConfigureAwait(false); 
task.Wait(); 

或者有什麼更好的解決辦法?

+3

如果以這種方式使用'ConfigureAwait',則不執行任何操作。正如您可能已經注意到的那樣,它會返回'TaskAwaitable',它應該是'await'-ed,而不是任務。任務本身不受影響。我認爲你對目前的工作(以及所有相關的風險)感到困惑。 –

+0

「關注懸掛線程等意外行爲」我認爲你應該先理解這個問題。這可以讓你斷定這是安全的。 – usr

回答

3

您指的是典型的SynchronizationContext死鎖。只要CreateIndexesAsync不使用SynchronizationContext這是非常不可能的,這是完全安全的。

研究什麼ConfigureAwait做什麼以及如何使用它。你目前的使用情況表明你並不知情。 task.ConfigureAwait(false);是無操作的,因爲它會創建一個新的TaskAwaiter並將其丟棄。