2010-10-05 80 views
0

我正在使用IOC編寫簡單的照片下載應用程序。有一個相當直接的步驟列表。獲取要下載的照片列表。選中此項,檢查並下載。下載可以在某些情況下通過FTP完成,通過http在其他方式完成,並通過其他Web服務完成。什麼是IOC應用程序中多線程的良好模式(windsor)

我在想,因爲我是國際奧委會土地新手,使用IOC最佳實踐/設計模式來啓動10個'下載線程'是一個很好的模式。

我使用的是Castle Windsor,但可以輕鬆切換到StructureMap或Spring,因爲我在這個過程中很早。

編輯:爲了清楚,我知道如何創建一個IPhotoDownloader接口,然後3個具體的photodownloader類,我不清楚如何控制線程以及如何知道什麼時候所有線程都完成了並繼續。

其次編輯迴應評論: 據我瞭解,這將是壞的直接引用在IOC應用程序的具體類,所以如果我想,例如,使用ThreadPool.QueueUserWorkItem多線程的下載我如何我會這樣做嗎?我是否會簡單地使用容器來解析我的線程啓動方法中每個線程上想要的具體類?像:

void StartThead(){ 
PhotoRetriever retriever = container.Resolve<PhotoRetriever>(); 
} 
+1

與IoC容器有關的問題如何?我的意思是認真的,我理解這個問題的方式,我看不出容器會對你寫的代碼做什麼影響 – 2010-10-05 12:33:24

+1

@Krysztof我認爲他在問什麼類型的東西應該被視爲好的模式與壞的模式。例如,對於維護不是線程安全的實現,將服務註冊爲單例將會產生問題。 @Tom - 你並不是真的會控制線程本身,而是將它考慮在你的生活方式選擇中(例如上面的例子)。在PerWebRequest,PerThread生活方式上進行一些搜索,你會看到一些模式出現。 – 2010-10-05 12:44:13

+0

@瑞恩,我不確定是這樣,但也許湯姆應該澄清 – 2010-10-05 13:04:31

回答

0

Krysztof讓我開始在正確的道路上,做一些這樣當我基本上是看到一些奇怪的行爲:

_fileList = new Stack<Uri>(); 
      for (int i = 0; i < 10; i++) 
      { 
       _fileList.Push(new Uri("http://mi.mirror.garr.it/mirrors/postfix/index.html")); 
       _fileList.Push(new Uri("ftp://mi.mirror.garr.it/mirrors/postfix/index.html")); 
       _fileList.Push(new Uri("http://www.google.com/adsense/static/it/LocalizedTerms.html")); 
       _fileList.Push(new Uri("http://www.cnn.com")); 
      } 

      _handles = new ManualResetEvent[ThreadCount]; 
      _watch.Start(); 

      // fire up threadCount threads to download files 
      for (int i = 0; i < ThreadCount; i++) 
      { 
       _handles[i] = new ManualResetEvent(false); 
       ThreadPool.QueueUserWorkItem(new WaitCallback(downloadThread), i); 
      } 

      // wait for all threads to finish 
      WaitHandle.WaitAll(_handles); 

................ 

private void downloadThread(object stateInformation) 
     { 
      var retriever = _IOCContainer.Resolve<HtmlTitleRetriever>(); 

而(!了fileURI = NULL) {

  var fName = retriever.DownLoadFile(fileUri); 


..... 

我看到的行爲是因爲我不知道生命週期屬性,默認Singleton,實際上我需要在這個實例中使用PerThread。

相關問題