2013-02-21 285 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控件。