2012-03-01 62 views
0

比方說,我有一種方法,每隔10ms不斷接收輸入,將數據添加到Queue<T>,另一個線程出列並執行一些處理,並寫入文件以保持一切流暢。原因是因爲處理將花費超過10毫秒。使用async/await和Task進行時間關鍵處理有什麼區別?

在使用.Net 4更新此方法時,我將使用長時間運行選項啓動一個新任務,以確保創建新線程。有一個BlockingCollection<T>將數據添加到任務方法中並使用BlockingCollection調用GetConsumingEnumerable來處理數據並將其寫入文件。

首先,我不完全確定是否需要任務來創建新線程,但由於我的無知,這似乎是最有效的方法。其次引進的asyncawait關鍵字

我可能再次改寫這個,這樣當數據到來時,調用標有async這確實處理,然後調用await FileStream.WriteAsync的方法。這將確保相隔10ms進入的數據是否可以正常處理,並且沒有後臺日志?我發現這些新關鍵字不會創建新線程,而只是以某種方式及時處理執行。

在我的情況下,這對我有什麼好處,還是應該堅持使用長時間運行的Task和BlockingCollection創建新線程?

+0

你的問題還不清楚 - FileStream進來了嗎?請澄清您的總體情況,以及您是否能*實際*在輸入到達時儘快處理輸入。 – 2012-03-01 13:16:55

+1

@JonSkeet FileStream正好表明我正在使用可用的新異步函數寫入文件。處理在另一個線程/任務上完成的原因是處理時間超過10ms。已更新問題以顯示此內容。 – Jon 2012-03-01 13:19:34

回答

1

如果您每隔10ms收到一次輸入並且處理時間超過10ms,那麼除非您在後端進行並行處理,否則您將無法跟上。

聽起來像生產者/消費者的方法是最適合你的情況。您可以將BlockingCollection<T>用於單獨的線程/任務,但您還應該考慮Dataflow library(新VS異步支持的一部分)。數據流庫允許您設置一個流水線(或網格),用於定義數據在系統中的流動方式;任務根據需要自動創建。

+0

我知道你可以在沒有新線程的情況下使用BlockingCollection,但我不確定它是如何工作的,如果不是在另一個線程上保持輸入和處理全部無縫工作。我知道任務應該處理內部和評估的事情,但聽起來有點可怕,你不能保證任何東西,而如果你知道你有一個專門的線程都應該沒問題! – Jon 2012-03-01 14:20:30

+0

Dataflow文檔非常清楚它的行爲方式,並且您可以通過很多選項來更改其行爲。數據流不使用BlockingCollection AFAIK。 – 2012-03-01 18:58:37

1

異步和等待關鍵字旨在幫助您編寫對花費很長時間來響應的函數/ API的異步調用。編譯器會在兩個方法中調用,即啓動任務的方法和調用完成時的回調方法。

在你的情況下,似乎沒有意義使用異步和等待,因爲你正在啓動一個單獨的任務來處理工作。工作完成後沒有第三件事需要發生。

+0

我會認爲異步和等待是爲了不僅僅是異步執行並且在完成時做某些事情而設計的。我可能是錯的,但? – Jon 2012-03-01 14:13:02

+0

這是因爲異步應用程序非常難以編寫,因爲您有超過1個異步請求。您必須記住所有已完成的異步操作,以及哪些結果取決於哪些操作。編譯器自動執行起來要容易得多。異步告訴編譯器,你的函數應該分解成幾個,並等待告訴它到底應該發生什麼。 – linkerro 2012-03-01 14:43:13

相關問題