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();
}
});