2011-03-23 63 views
0

我從來沒有寫過多線程代碼(除了一些基本的backgroundworker技巧),並希望得到一些關於如何處理我的問題的指導。線程簡介 - 進程xml文件

我有一個XML文件,這是一個序列化的List<Stock>。對於這些庫存項目中的每一個,我都需要執行名爲UpdatePrice()的web服務調用。

我想要做的是採取這些項目中的每一個,創建一個線程池(誰的大小取決於我需要處理的行數)並開始進行web服務調用。

我不是要求一個完整的解決方案(顯然),但真的很感謝一些人通常會如何解決這個問題的指導。

我看到的最大問題是我如何指定哪些線程可以在哪些對象上工作。我是否僅僅根據我製作的線程數量和拆分工作來劃分它?或者我最好允許每個線程任意選擇一個項目從列表中處理? (然後我有鎖問題,但作爲一個加號可以確保沒有線程空閒)

正如我之前所說,我不是在尋找一個完整的解決方案,但只是一些基本的指導,從哪裏開始,因爲老實說我迷失在這一個並沒有寫一行代碼。

PS:也是在.NET線程安全中自動生成web服務代理?

+0

您使用的是什麼版本的.NET? – timothyclifford 2011-03-23 03:10:51

+0

框架4.0上的C# – 2011-03-23 03:11:58

回答

1

我會建議看着TPL和PLINQ尋求解決方案。使用Parallel.ForEach()的簡單示例解決方案可能如下所示(在本例中並行調用限制爲5)。

List<Stock> stocks; 
Parallel.ForEach(stocks, 
       new ParallelOptions() { MaxDegreeOfParallelism = 5 }, 
       (stock) => 
{ 
    float newPrice = UpdatePrice(stock.TickerSymbol); //web service call 
    stock.Price = newPrice; 
}); 
+0

謝謝你的這個例子。它看起來非常簡單!你能否告訴我們=>運算符的名字是什麼(或者什麼是正確的術語)?它看起來像某種委託任務,我曾看過它,但想了解更多。 – 2011-03-23 04:01:17

+0

=>是一個lambda表達式,您可以通過該表達式創建匿名函數調用。 http://msdn.microsoft.com/en-us/library/bb397687.aspx – timothyclifford 2011-03-23 04:14:06

+0

謝謝你! – 2011-03-23 06:19:01

1

我想:

  • 首先讀取整個XML數據同步。
  • 然後,我會把每個元素處理在一個隊列中。然後,你可以產生N個處理線程,在每個處理線程開始時,它會「彈出」你的隊列中的一個元素,將這段特定的代碼封裝在一個互斥體/信號量(谷歌C#互斥體或併發訪問或任何相關的)。這很容易在C#中用任意對象上的「鎖定」關鍵字完成。

希望這會有所幫助。 Pierre。

1

在這裏使用線程沒有意義。一個線程只能給你一個資源:更多的CPU週期,只要你有一個多核心的CPU。這不是您需要加速程序的資源。您需要更快的Internet連接。

如果你有一個用戶界面,你不想凍結,那麼BackgroundWorker的技巧將工作得很好。

+0

不知道我會在那裏同意你的看法。如果你有帶寬的線程調用到單個Web服務將工作更快,然後單線程的過程。這是諸如免費下載管理器之類的應用程序的原理,不是嗎? – 2011-03-23 03:16:12

+0

Web服務的行爲不像HTTP或FTP服務器。但問問網站所有者是否可以確保聯繫。如果他們這樣做,是否允許你繞過它。當然你不是。無論如何,他們會引導你。 – 2011-03-23 03:20:21

+0

是的web服務不能像ftp服務器一樣工作(雖然web服務是http服務器 - 但這是語義)。關鍵在於,無論您有web服務,ftp還是http服務,都需要執行特定的工作量。通常,http請求中的限制不是帶寬,而是ping時間。因此,如果您能夠將這項工作分解爲多個併發呼叫,結果將是正面的。話雖如此,但他們可能會阻止特定用戶的IP或呼叫是有效的。我必須找出答案。 – 2011-03-23 03:49:45