2017-01-16 98 views
2

在c#mongodb驅動程序中,有同步和異步方法可用,如下所示?我應該使用c#mongodb驅動程序的同步還是異步方法?

_mongoCollection.InsertOneAsync(entity); 
_mongoCollection.Insert(entity); 

我相信,在大多數情況下,數據訪問層異步完成的工作量非常少。所以,我在等待數據庫立即調用如下:

await _mongoCollection.InsertOneAsync(entity); 
await _mongoCollection.DeleteOneAsync(query); 
await _mongoCollection.Find(query).ToListAsync(); 

現在我的問題是:當我在等待的DB立即調用,我沒有看到任何使用異步方法在這裏。那麼,我應該使用異步方法嗎? (或)我應該使用同步方法嗎?

回答

0

這取決於您是否在下一個語句中使用了結果。

例如,

void async myMethod(){ 
    var result = funcAsync(); 
    // do some additional work.. 
    var data = await result; 
    . 
    . 
} 

上面是您應該使用異步等待的場景。

現在讓我們假設你是否有方法;

void async myMethod(){ 
    var result = await funcAsync(); // here result is required before any other logic ahead 
    . 
    . 
    . 
} 

在這裏,你真的不需要使用異步等待,但如果在不久的將來,您的系統改變,你需要添加額外的代碼之間,那麼你可能需要改變方法簽名和相應的該方法被調用的位置。

所以這完全取決於要求。

1

這真的取決於你的要求。

從你貼我可以猜測,你不需要異步調用,但它可以派上用場,與上一次調用_mongoCollection.Find(...).ToListAsync()

異步調用(恕我直言)的代碼應該當你只使用一些獨立/複雜的邏輯。在例子,你表明我認爲你只能await最後一次通話使其:

_mongoCollection.Insert(entity); 
_mongoCollection.Find(query).ToListAsync(); 

這樣你可以簡單地做一些額外的邏輯,同時等待ToListAsync()

_mongoCollection.Insert(entity); 
Task<List<object>> _task = _mongoCollection.Find(query).ToListAsync(); 
// my complex logic/calculations and stuff 
await _task; 

爲100%,說實話,我不要沒有看到任何其他原因使用異步調用。

我的觀點是,從你的例子中,異步調用的用法是沒用的。

1

我認爲以前的答案缺少一個重要的異步點;即當您使用異步方法**時,可以釋放當前(大部分)I/O操作完成時所在的線程,並且可用於應用程序中的其他位置;例如爲其他請求服務。

讓我們假設Mongo數據庫位於另一臺服務器上。即使有一個快速的網絡和快速的Mongo實例,每個命令仍然可能是5ms,在2GHz的CPU上是1000萬個時鐘週期。雖然您不打算讓所有這些用於運行代碼,但由於各種開銷,如果有一個可以高效地使用其他線程的應用程序,您仍然可以獲得優勢

因此,如果您的應用程序是例如網站,API或UI,我會使用異步方法。如果它是一個單線程控制檯應用程序,您可能不會獲得任何上述好處。

-

**這是假設蒙戈異步方法是真正的異步,而不僅僅是包裝器同步的方法。

相關問題