2012-03-28 51 views
0

我讀the article on copying streams asynchronously。 我注意到只有一個緩衝區被用來讀/寫。我在哪裏可以獲得異步流拷貝.net

在哪裏做使用異步調用流副本獲得我的東西?

由於有一個緩衝區,因此運行時的異步解決方案似乎非常同步。 寫入必須等待讀取,下一次讀取必須等到寫入緩衝區。

的幾點思考:

我所看到的變體使用多個緩衝區。 恕我直言,只會使東西更復雜,使用更多的內存並推遲問題。 它允許多個讀取並行寫入一些擴展。

在文件的情況下,我可以想象一個更輕鬆的寫入解決方案:讀取時寫入塊並在讀取所有文件時固定順序。 (文件系統必須支持這一點)。

我讀的文章,因爲我使用.NET 3.5和不能使用.NET 4.0或4.5呢。

(微軟科網ADRES反彈的netqa)

回答

2

異步處理可以幫助每當你處理非CPU相關的等待時間,並希望避免那些沒有跨線程的瘋狂金額(不很好地擴展 - 不應該有每個CPU線程太多,因爲線程是「昂貴」的資源,豐富的上下文切換可能會導致性能下降)。

典型的恩人因此是IO操作,因爲與處理數據所需的計算工作量相比,磁盤和網絡都是「慢」的。所以,只要你有許多並行流(網絡和磁盤),你應該使用異步操作來處理它們。

也就是說,正確的異步編程很難,尤其是沒有新的.NET編譯器的支持。

一個好的異步拷貝應該至少使用兩個緩衝區;一個讀取數據(異步),另一個同時寫入數據(異步)。當然,空閒的寫入器只會在讀取器完成寫入後才啓動,而空閒的讀取器只有在至少有一個備用緩衝器(例如寫入器已經寫完)時纔會啓動。如果只有一個緩衝區,則在連續的讀取和寫入操作之間會有中斷,例如,它將始終是「讀取,寫入,讀取,...寫入」而不是「讀取,讀取+寫入,讀取+寫入......寫入」。

1

寫有等待讀取

當然它中。如果你沒有讀取數據,你會寫什麼?

下一次讀取必須等到寫入緩衝區。

避免這種情況在某些情況下可能有意義,但您確實需要對其進行分析。各種緩存以及從硬盤讀取和寫入數據的方式都會影響到這一點。如果有一些性能優勢,它可能不會很大。

我們您的主要問題:

哪裏使用異步調用獲得我的東西做一個流拷貝?

收益來自事實,即您在IO發生時不會阻塞任何線程。這對於性能很重要,因爲線程是昂貴的資源(其中每個需要1 MB的虛擬內存和物理內存)。這可以在像ASP.NET這樣的環境中發揮巨大作用,其中每個請求都由不同的線程處理。

如果你正在寫一個桌面應用程序,只是複製一些文件,這可能不會怎麼了你,只要你不阻止用戶界面線程。