2013-02-21 284 views
1

我有一個看起來像這樣的方法執行查詢:多線程:啓動一個線程,而另一個進程不斷去

public void SomeMethod() 
{ 
    foreach (SomeModel x in TheListOfSomeModel) 
    { 
     do some work 
     .... 
     if (SomeCondition) 
     { 
      x.ExecuteQuery(); 
     } 
    } 
} 

基本上,SomeModel具有運行存儲的一個特性的更新查詢的方法將對象轉換爲數據庫中的字段。由於當前編寫的代碼,如果查詢需要運行,整個循環將一直處於暫停狀態直到查詢完成。如果可以任何用途,TheListOfSomeModel只有5個元素。

除了使用Parrallel ForEach,我該如何改變這個以使x.ExecuteQuery()在單獨的線程上運行?

謝謝。

+0

爲什麼你不想使用Parallel.ForEach? – 2013-02-21 01:05:40

+0

@MikeParkhill:在大多數情況下,SomeCondition將在90%的時間內出現錯誤。 Parrallel.ForEach增加了一些開銷,因爲循環只運行5次,我認爲它會比傳統的foreach慢。如果查詢實際運行,我只想讓線程發生。 – frenchie 2013-02-21 01:10:18

回答

3

您可以運行它像這樣一個任務...

Task.Factory.StartNew(() => x.ExecuteQuery()); 
2

要小心,不要產卵任務/線程(除非你用C#5個工作),也請務必關閉時,在循環變量您爲每個線程使用單獨的連接/上下文。

public void SomeMethod() 
{ 
    foreach (SomeModel x in TheListOfSomeModel) 
    { 
     var model = x; 
     //do some work 
     .... 
     if (SomeCondition) 
     { 
      Task.Factory.StartNew(() => model.ExecuteQuery()); 
     } 
    } 
} 
0

異常處理冷落爲簡潔:

using System.Threading.Tasks;  
.... 

public void SomeMethod() 
{ 
    Task.Factory.StartNew(()=> 
    { 
     foreach (SomeModel x in TheListOfSomeModel) 
     { 
      //do some work 
      .... 
      if (SomeCondition) 
      { 
       x.ExecuteQuery(); 
      } 
     } 
    }); 
} 

這將在一個新的線程中運行它。如果使用UI執行此操作,並且您收到CrossThreadExceptions,則需要通過InvokeBeginInvoke訪問UI控件。