2016-06-07 50 views
1

我有一堆彼此獨佔的方法,因此可以並行運行。有沒有這樣做的好方法?到目前爲止,我有以下兩種實現,但我不確定是否應該使用其中一種。Parallel.For vs Parallel.Invoke

使用Parallel.For

Parallel.For(0, 2, i => 
{ 
    switch (i) 
    { 
     case 0: 
      SomeMethod1(); 
      break; 
     case 1: 
      SomeMethod2(); 
      break; 
    } 
}); 

使用Parallel.Invoke

Parallel.Invoke(
    () => { SomeMethod1(); }, 
    () => { SomeMethod2(); } 
); 

以下哪種明智最好的表現?或者還有另一種更好的方法嗎?

+1

使用最易讀的:'Parallel.Invoke(SomeMethod1,SomeMethod2);'不需要將方法包裝在lambda中。 – Henrik

+0

@Henrik如果方法是'var foo = bar();'我仍然必須將它們包裝在lambda中,但是不是嗎? – TheLethalCoder

回答

3

我認爲這裏的表現不應該成爲問題。這都是關於可讀/可維護的代碼。

  • 第一個;我認爲將開關置於Parallel.For是一種不好的做法。它很混亂,並且與大開關,它將是不可讀/不可維護的
  • 第二個;更好的是,您可以先將動作存儲到List<Action>中。

就像Henrik已經說過的:Parallel.Invoke(SomeMethod1, SomeMethod2);是(也適用於我)在這種情況下最好的可讀性。 (在這種情況下它的工作原理,因爲沒有參數/返回值)


但是隨着你的問題的反應;每次調用執行一次switch/case,都會產生額外的開銷。