我有一个List<TaskClass> TaskList
我们可以使用并行循环迭代的项目。
列表中的项目按特定顺序排序,因为 TaskClass 使用自己的 IComparable 实现CompareTo(object obj)
方法。
因此,我们需要按顺序执行的项目。
请注意,它们不必按顺序完成,只需按顺序开始即可。
因此TaskList[0]应该首先启动;然后任务列表[1],任务列表[2],...
但是,我们并不关心 TaskList[2] 是否先完成,还是 TaskList[0] 先完成。
这是我想出的快速代码来尝试缓解这个问题:
//Construct a ConcurrentQueue and populate it with our SORTED list
//of TaskClass items so when we go through a parallel loop
//they are acted upon in sorted order. A parallel loop does not
//guarantee ordering, which we need to make sure tasks with a higher
//number are done first.
ConcurrentQueue<TaskClass> cq = new ConcurrentQueue<TaskClass>();
for (int x = 0; x < TaskList.Count; x++)
cq.Enqueue(TaskList[x]);
Parallel.For(
0,
cq.Count,
new ParallelOptions { MaxDegreeOfParallelism = DISystem.MaxConcurrentThreads },
x =>
{
TaskClass tc = null;
if (cq.TryDequeue(out tc))
{
TaskTypeManager ttm = new TaskTypeManager();
tc.Working = true;
tc.Started = DateTime.Now;
ttm.ProcessTaskItem(tc);
}
}
);
现在我认为问题是当 Parallel.For 循环完成时,原来的List<TaskClass> TaskList
将不会更新为最新值。
实现这一目标的最佳方法是什么?
修改后的代码如下? (标有“//new”的行)
ConcurrentQueue<TaskClass> cq = new ConcurrentQueue<TaskClass>();
for (int x = 0; x < TaskList.Count; x++)
cq.Enqueue(TaskList[x]);
List<TaskClass> NewTaskList = new List<TaskClass>(); //new
object lockObject = new Object(); //new
Parallel.For(
0,
cq.Count,
new ParallelOptions { MaxDegreeOfParallelism = DISystem.MaxConcurrentThreads },
x =>
{
TaskClass tc = null;
if (cq.TryDequeue(out tc))
{
TaskTypeManager ttm = new TaskTypeManager();
tc.Working = true;
tc.Started = DateTime.Now;
ttm.ProcessTaskItem(tc);
lock (lockObject) //new
{
NewTaskList.Add(tc);
}
}
}
);
NewTaskList.Sort(); //new
TaskList.Clear(); //new
TaskList = NewTaskList.ToList(); //new
或者有人有任何其他想法/建议/改进吗?