2014-04-28 130 views
1

除了Flush()方法,我注意到Stream類也有一個FlushAsync()方法。在什麼情況下你會使用FlushAsync()方法?是否沖洗緩衝區太昂貴以至於不能異步運行?Stream Flush vs FlushAsync

+0

是的,它可以是非常廣泛的,因爲它實際上將數據寫入底層媒體。你可以寫很多數據或者媒體可能很慢(例如網絡),或者中間可能有一些抽象層,在有效寫入之前會做進一步的處理。它可以像其他任何寫作操作一樣廣泛。 –

+0

您應該將其作爲答案發布。 – Gigi

+0

好的,我做到了(我試圖擴大一點點)。 –

回答

3

是的,它可能是非常昂貴的,因爲它可能可能實際寫入數據到底層媒體。

在任何這些條件可能爲真:

  • 您有大量的數據的寫入(根據緩衝器大小)。
  • 媒體本身可能很慢(網絡或接口速度較慢的設備)。
  • 中間可能有抽象層,在有效寫入之前會進行進一步處理(例如壓縮/加密抽象)。

它可以是昂貴不亞於其他任何寫操作再有就是Async版本(而且它會幫助API的一致性)。

FlushAsync()如何實現是一個實現細節,它可能是線程池中的簡單Task或更復雜的東西(異步I/O可能涉及操作系統本身)。它甚至可能是同步的(想象刷新一個MemoryStream,它沒有任何緩衝區)。

+0

關於「大量數據」,請注意,這包括所有其他未決的IO,而不僅僅是源自使用流的那些IO。這就是爲什麼最好不要調用FlushAsync()。 –

0

從我收集的內容中,調用stream.Write()可能會或可能不會將數據放入中間內存緩衝區,然後再將其卸載到其目標目標。發生這種情況時,stream.Write()在實際寫入所有數據之前解除封鎖。

stream.Flush()的作用是阻止程序,直到中間緩衝區清空。根據傳輸速度和數據大小,您可能需要異步訪問Flush()