2016-06-07 80 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,都会产生额外的开销。