2011-09-22 95 views
4

我有1集合,我正在將內容保存到持久存儲。然後我最終得到了3個我喜歡保存到持久存儲的集合。使用線程池或線程

起初我使用一個ThreadPool來保存一個集合,但現在我有3個集合。由於每個集合都去了不同的存儲,我不想將它們合併或保存到同一個地方。

我的問題是我應該使用手動線程併爲每個Save()方法創建一個線程,或者應該爲每個方法創建3個線程池,還是應該在一個ThreadPool.QueueUserWorkItem調用中調用所有3個方法。

1.首先方法

ThreadPool.QueueUserWorkItem(o => 
      { Save<Foo>(ConcurrentCollectionStorage.Bus1); 
       Save<Bar>(ConcurrentCollectionStorage.Bus2); 
       Save<Car>(ConcurrentCollectionStorage.Bus3); 
      }); 

2.第二種方法

ThreadPool.QueueUserWorkItem(o => 
       { Save<Foo>ConcurrentCollectionStorage.Bus); }); 
ThreadPool.QueueUserWorkItem(o => 
       { Save<Bar>(ConcurrentCollectionStorage.Bus2); }); 
ThreadPool.QueueUserWorkItem(o => 
       { Save<Car>(ConcurrentCollectionStorage.Bus3); }); 

3.第三條道路。手動創建線程並加入它們。

在做這些操作時,我不希望我的應用程序掛起。我希望它能夠處理和保存數據,並完成整個應用程序,但不會影響前臺進程。

這樣做的最好方法是什麼?

我應該使用哪一個?有一個更好的方法嗎?

+1

線程購買更多的CPU週期,而不是更多的磁盤。目前尚不清楚關鍵資源在哪裏,但很可能不是cpu週期。 –

+0

要跟從@Hans Passant,爲什麼要使用3個線程?你能不能將所有3個集合排成一個線程?您可以將所需的目標服務器/文件夾/任何內容加載到每個項目中,以便線程知道將它放在哪裏。 –

+0

是的,這不是很受CPU限制,但我希望它們在不影響應用程序的情況下發生,這就是爲什麼我想將它們作爲線程池運行的原因。你能想到更好的東西嗎? – DarthVader

回答

2

在.NET 4.0中,您可以使用任務並行庫:

Task.Factory.StartNew(() => { Save<Foo>(ConcurrentCollectionStorage.Bus1); }); 
    Task.Factory.StartNew(() => { Save<Bar>(ConcurrentCollectionStorage.Bus2); }); 
    Task.Factory.StartNew(() => { Save<Car>(ConcurrentCollectionStorage.Bus3); }); 

但是,從您的問題中不清楚關鍵瓶頸是什麼。如果您遇到瓶頸問題,則TPL無法爲您提供幫助,即Disk IO或網絡延遲。

如果你想你的主線程等待他們全部完成,你可以做到這一點(有幾種方法可以做到這一點):

Task t1 = Task.Factory.StartNew(() => { Save<Foo>(ConcurrentCollectionStorage.Bus1); }); 
    Task t2 = Task.Factory.StartNew(() => { Save<Bar>(ConcurrentCollectionStorage.Bus2); }); 
    Task t3 = Task.Factory.StartNew(() => { Save<Car>(ConcurrentCollectionStorage.Bus3); }); 

    Task.WaitAll(t1,t2,t3); 

這種方式運行任務的線程將等待,直到他們完。 t1,t2和t3將異步運行。

+0

爲什麼不在一個任務中調用3個方法,但是你生成3個任務? – DarthVader

+0

@ user177883:這取決於你想要做什麼。如果你願意,你可以把它們全部放在一個任務中。就像我說的,這取決於你的瓶頸。如果保存操作會阻止,那麼您可以讓它們在一個任務中運行。 –

+0

他們是否異步運行?他們是否彼此等待完成? – DarthVader

3

由於每個集合都轉到不同的存儲,我不想將它們組合或保存到同一個地方。

在做這些操作時,我不希望我的應用程序掛起。我希望它能夠處理和保存數據,並完成整個應用程序,但不會影響前臺進程。

隊列線程池中的三個線程。

+0

我需要在threalpool中加入3個線程嗎?爲什麼我在threadpool內創建線程? – DarthVader

1

如果您使用.net 4,您應該使用TASK而不是調用ThreadPool API。 如果您的保存操作不足,請按原樣使用。在情況下,它是很長,這就是爲什麼你正在考慮人工線程,那麼你應該使用的任務,但將其標記爲「長時間運行」

HTH