C# NET 4中的任务线程列表

C# NET 4中的任务线程列表,c#,.net-4.0,task-parallel-library,C#,.net 4.0,Task Parallel Library,我有一组结构良好的对象,它们是沿着以下路线设置的: abstract class Data { public abstract void GetData(); public abstract void Process(); } abstract class DataSource1 : Data { public void GetData() { ... } } class DataSource1ProcessorA : DataSource1 { public void Pro

我有一组结构良好的对象,它们是沿着以下路线设置的:

abstract class Data 
{
  public abstract void GetData();
  public abstract void Process();
}
abstract class DataSource1 : Data
{
  public void GetData() { ... }
}
class DataSource1ProcessorA : DataSource1
{
  public void Process() { ... }
}
abstract class DataSource2 : Data
{
  public void GetData() { ... }
}
class DataSource2ProcessorA : DataSource2
{
  public void Process() { ... }
}
class DataSource2ProcessorB : DataSource2
{
  public void Process() { ... }
}
目前,我正在按顺序处理每个DataSourceProcessor,随着我们添加更多的源和处理器,处理时间开始变长。每个源都是完全不相关的,但每个处理器都需要按顺序运行。所以我需要一种方法来扭转局面

new List<List<Data>> tasks = new List<List<Data>>()
{
  new List<Data>() { new DataSource1ProcessorA() },
  new List<Data>() { new DataSource2ProcessorA(), new DataSource2ProcessorB() }
}
foreach (List<Data> source in tasks)
{
  foreach(Data data in source)
  {
    data.GetData();
    data.Process();
  }
}
new List tasks=new List()
{
新列表(){new DataSource1ProcessorA()},
新列表(){new DataSource2ProcessorA(),new DataSource2ProcessorB()}
}
foreach(在任务中列出源)
{
foreach(源中的数据)
{
data.GetData();
data.Process();
}
}
变成一系列的任务。我以前处理过任务,虽然我没有做过任何真正复杂的事情,我只是不知道如何用任意序列的顺序调用启动任意数量的任务


我不需要以任何方式访问任务,只需要启动它们并报告它们抛出的任何错误。最好是DataSource2ProcessorA中的错误不应阻止DataSource2ProcessorB运行,但如果编码更容易让一个错误杀死整个DataSource的线程,我可以接受这一点。

使用下面的命令在单独的线程上触发每个处理事件并记录错误(或重新引发异常):


为什么不使用parallel.FX库?您可以轻松地使用
parallel.For
parallel.ForEach
方法。

请参见


.net 4添加了执行并行foreach的功能。

您希望使用并行foreach,以及按每个项目的顺序处理列表的操作。即:

new List<List<Data>> tasks = new List<List<Data>>()
{
  new List<Data>() { new DataSource1ProcessorA() },
  new List<Data>() { new DataSource2ProcessorA(), new DataSource2ProcessorB() }
}

Parallel.ForEach(tasks, (items) =>
{
    foreach (var item in items)
    {
        item.GetData();
        item.Process();
    }
});
new List tasks=new List()
{
新列表(){new DataSource1ProcessorA()},
新列表(){new DataSource2ProcessorA(),new DataSource2ProcessorB()}
}
Parallel.ForEach(任务,(项目)=>
{
foreach(项目中的var项目)
{
item.GetData();
项目。过程();
}
});

也就是说,虽然这确保了
DataSource2ProcessorA
DataSource2ProcessorB
之前得到处理,但无法保证任务的运行顺序。

我知道可能有一些方法可以通过并行实现这一点,但我考虑的是嵌套并行和连续操作。我从来没有想过只在内部使用“老式”foreach循环。(我也不太清楚如何把名单传进来。)谢谢!
new List<List<Data>> tasks = new List<List<Data>>()
{
  new List<Data>() { new DataSource1ProcessorA() },
  new List<Data>() { new DataSource2ProcessorA(), new DataSource2ProcessorB() }
}

Parallel.ForEach(tasks, (items) =>
{
    foreach (var item in items)
    {
        item.GetData();
        item.Process();
    }
});