2014-02-26 61 views
0

我有一個C#表單,包含一個按鈕,一個計時器和一個ImageSearch類。如何獲得多個對象同時處理東西

此按鈕啓動6個對象(ImageSearch),它將爲我執行一些圖像搜索。

這6個對象每個單獨更新主窗體上的一個圖片框。

當我的按鈕創建對象並啓動計時器時,計時器將執行每個對象的爬行功能。

我的問題是他們一次處理一個圖像,而不是單獨處理,即使它們是單獨的對象。我如何讓他們獨立運行,製造6個計時器?

我希望所有對象同時運行。

當我的表單開始時,我創建了所有6個對象。

ImageSearch imageSearch1 = new ImageSearch(URL); 
ImageSearch imageSearch2 = new ImageSearch(URL); 
ImageSearch imageSearch3 = new ImageSearch(URL); 
ImageSearch imageSearch4 = new ImageSearch(URL); 
ImageSearch imageSearch5 = new ImageSearch(URL); 
ImageSearch imageSearch6 = new ImageSearch(URL); 

然後我的按鈕只是啓動定時器,定時器1到定時器6被啓用並設置間隔。

定時器1例如:

imageSearch1.Crawl(); 
+0

沒有代碼,很難弄清楚你的計時器在做什麼,無論如何,計時器似乎不是一個合理的解決方案。此外,如果圖像源自網絡,圖像加載應該是異步的,即包裝在任務或線程中。 – Candide

+0

某些代碼會有所幫助。 – EagleBeak

+1

我想你將不得不爲你的目的使用多個線程。 –

回答

0

什麼,你會需要一個計時器?

如何使用並行LINQ代替:

imageSearchers 
    .AsParallel() 
    .ForAll(x => x.DoSomeThing()); 

PLINQ嘗試使用線程的明智ammount的這一點。

你也可以使用多個Task的:

 Task1 = Task.Factory.StartNew(() => imageSearch1.Search()); 
     Task2 = Task.Factory.StartNew(() => imageSearch2.Search()); 
     Task3 = Task.Factory.StartNew(() => imageSearch3.Search()); 
     Task.WaitAll(new [] { Task1, Task2, Task3, ...}) 

注意:您不需要等待‘這裏’,如果你不想,但在某處你的應用程序,你應該跟蹤異步工作,這樣就可以取消它在關機/等待它結束/處理異常...

0

我想你會使用新的任務API,像會更好:

var tasks = new List<Task>(); 
for(var i = 0; i < 6; i++) 
    tasks.Add(Task.Run(() => ImageSearch.Search(forImage))); 
Tasks.WaitAll(tasks.ToArray()); 

這樣,您可以卸載所有的調度並等待框架,並專注於您的業務邏輯。