2

我將使用「進程」來指代將要並行發生的工作,而「入隊」指的是將用來啓動該進程的任何進程(無論是Task.Run,​​ThreadPool.QUWI,new Thread()... whatever)。保證並行線程/任務/任務的立即啓動

我們有一個性能敏感的程序,產生多個並行進程來收集數據。

我們遇到了產卵問題,即進程沒有立即開始。

具體來說,如果我們準備一個進程,啓動一個計時器,將進程排入隊列,並檢查計時器作爲進程中的第一個動作...然後我們看到時間延遲偶爾會延伸到100s甚至1000s毫秒。

鑑於該過程本身應該只運行3-10秒,排隊和激活過程之間有2秒的延遲是一個主要問題。

= - = - = - = - = - = - = - = - = - = - = - = - = - = - =

目前我們的實現開始使用TP.QUWI,然後我們繼續前進使用Task.Run。 我們最初的調查將我們引向Threadpool使用的線程創建策略,並使用ThreadPool.SetMinThreads(),所以我們正在追求這個角度,看看是否能完全解決問題。

但是如果我們的目標是在排隊之後立即啓動,那麼我們應該考慮另一種更改/方法嗎?

+0

請問您的應用程序中使用'ThreadPool'廣泛適用於其他對時間不敏感的「過程」?爲什麼時間對您來說如此重要? – svick

+0

我不明白問題,@svick? 是的,我們也使用ThreadPool來處理一些不是' t在表演關鍵拍拍中hs,但我沒有看到相關性。 而且就像我說的...該程序對性能非常敏感...我不明白爲什麼這個原因是真的會有影響嗎? – Brondahl

回答

1

Taken from here(我強烈建議你讀了):

好像你希望可以通過overridding默認任務調度.... scarey達到什麼......

你不能認爲所有並行任務都會立即運行。根據當前的工作負載和系統配置,任務可能會按照計劃逐個運行,也可能同時運行。有關如何計劃任務的更多信息,請參閱本章後面的「默認任務計劃程序」部分。

使用自定義調度

創建任務可以通過定製的.NET任務如何安排和運行的細節覆蓋多數民衆贊成使用的任務工廠方法的默認任務調度。例如,您可以提供一個自定義任務計劃程序作爲TaskFactory.StartNew方法的一個重載版本的參數。

在某些情況下,您可能想要覆蓋默認調度程序。當您希望您的任務在特定的線程環境中運行時,會發生最常見的情況......當默認任務調度程序的負載平衡啓發式方法對您的應用程序不起作用時,會發生其他情況。有關更多信息,請參閱本章後面的「線程注入」部分。

除非你指定,任何新的任務將使用當前的任務調度...

您可以實現自己的任務調度程序類。有關更多信息,請參閱本章後面的「編寫自定義任務計劃程序」一節。

線程注入

的.NET線程池自動管理池中的工作線程數...

this SO post "replacing the task scheduler in c sharp with a custom built one讀「

+0

與僅僅顯式啓動線程相比,我發現這種相當複雜的方法幾乎沒有什麼好處:在談論10秒工作時,線程創建的開銷是微不足道的,如果想要重用線程,自定義解決方案將不是微不足道的。任務接口是有用的,但是一個小包裝仍然可以將工作公開爲任務。 – Voo