我有对象列表。对象是类的实例。每个对象内部都是具有一些值的属性:
List<SomeClassTask> lstSomeTaskList = new List<SomeClassTask>();
for (int i=0; i<5; i++)
{
SomeClassTask tsk = new SomeClassTask();
Thread.Sleep(500);
tsk.SomeProperty = new Random().Next(1, 11);
lstSomeTaskList.Add(tsk);
}
下一步是为每个对象运行并行任务
Parallel.ForEach(lstSomeTaskList, task => task.StartProcessing(task.SomeProperty));
我只想开始特定的任务,例如具有值1(SomeProperty = 1)的任务。
这是课程:
class SomeClassTask
{
public int SomeProperty { get; set; }
public void StartProcessing(int maxRange)
{
int rnd = new Random().Next(1, maxRange);
Thread.Sleep(1000);
Console.WriteLine("Parallel task -> radnom created value: " + rnd);
}
}
是否可能在
Parallel.ForEach
提供一些条件来检查某些对象属性吗?
答案 0 :(得分:2)
Parallel.ForEach
获得IEnummerable
作为源,因此您只需要过滤列表对象并将其提供给ForEach,例如:
SomeClassTask a = new SomeClassTask { SomeProperty = 1 };
SomeClassTask b = new SomeClassTask { SomeProperty = 2 };
List<SomeClassTask> lstSomeTaskList = new List<SomeClassTask> { a, b };
Parallel.ForEach(lstSomeTaskList.Where(task => task.SomeProperty == 1),
task => task.StartProcessing(task.SomeProperty));
编辑
正如评论已经指出的那样,您应该检查一下-> https://codeblog.jonskeet.uk/2009/11/04/revisiting-randomness/
答案 1 :(得分:2)
您应该使用Microsoft的Reactive Framework(又名Rx)-NuGet System.Reactive
并添加using System.Reactive.Linq;
-然后您可以执行以下操作:
IObservable<SomeClassTask> query =
from i in Observable.Range(0, 5)
let tsk = new SomeClassTask() { SomeProperty = _random.Next(1, 11) }
where tsk.SomeProperty == 1
from u in Observable.Start(() => tsk.StartProcessing(tsk.SomeProperty))
select tsk;
IDisposable subscription = query.Subscribe();
现在,如果要在查询完成后获得所有结果,请执行以下操作:
IDisposable subscription =
query
.ToList()
.Subscribe(list => { /* use `list` here */ });
如果您需要在流程完成之前完成流程,则只需执行subscription.Dispose();
。