短缺問題:採用這種多線程問題的方法是什麼?
我想產生一個單一的後臺線程會處理(有一個線程像一個線程池)提交到隊列中的工作項目。一些工作項目能夠報告進展情況,有些則不能。我應該使用.NET的無數多線程方法中的哪一種?
龍解釋(避免詢問有關half which doesn't make any sense):
我的WinForms應用程序的主窗口被垂直分割爲兩半。左半部分包含帶有項目的樹視圖。當用戶在樹視圖中雙擊一個項目時,該項目在右半部分打開。幾乎所有的對象都有很多屬性,分成幾個部分(由製表符表示)。這些屬性的加載需要相當長的時間,通常大約10s,有時更多。每隔一段時間就會添加更多的屬性,所以時間會增加。
目前,我的單線程設計使UI在這個時候無法響應。自然這是不可取的。我想在背景中逐個加載東西,並且只要一個部件被加載就可以使用。對於其他部分,我會顯示一個帶有加載動畫或其他東西的佔位符選項卡。另外,雖然有些零件是在單一冗長的單片操作中加載的,但其他零件由許多較小的函數調用和計算組成,因此可能會顯示加載進度。對於這些部件,看到進展情況會很好(特別是如果他們掛在某個地方,會發生什麼情況)。
請注意,數據源不是線程安全的,所以我無法同時加載兩個部分。
哪種方法最適合實現此行爲?有沒有一些.NET類可以解除我的肩膀上的一些工作,或者我應該沮喪地用Thread
?
A ThreadPool
沒有工作項目隊列管理,但沒有進度報告設施。另一方面,BackgroundWorker
支持進度報告,但它是針對單個工作項目的。有沒有可能是兩者的結合?
是的,如果用戶點擊10個節點,他會等待。實際上,用戶界面允許他打開幾個項目並同時查看它們,這是一個有效的場景。但我同意,如果他*關閉了其中一項,則加載應該中止。爲他目前正在觀看的項目設置優先級也是一個很好的功能,沒有想到這一點。所以是的,它變得混亂。我想那裏不會有任何遠程預製的東西。順便說一句 - 你不覺得一個簡單的'volatile int _current'應該是足夠的,如果只有一個線程正在寫入,並且只有一個線程正在讀取它? – 2010-08-13 09:46:06
葉,揮發性應該沒問題。 – 2010-08-13 09:50:51