用下面的代码,会发生一个错误。
报的错误是FlowItemListP[i]的索引超范围,FlowItemListP.Count的值是3, 但是FlowItemListP[i]居然索引值是3
打死都想不到i怎么可能计数到3
for (int i = 0; i < FlowItemListP.Count; i++) { if (FlowItemListP[i].RunModeF == MotionFlowItemRunMode.串行) { serailTaskFactory.StartNew(() => FlowItemListP[i].Run(serialUnitCTS.Token), serialUnitCTS.Token, TaskCreationOptions.LongRunning, serialUnit); //FlowItemListP[i].Run, i, serialUnitCTS.Token); } else if (FlowItemListP[i].RunModeF == MotionFlowItemRunMode.并行) { parallelTaskFactory.StartNew(() => FlowItemListP[i].Run(parallelUnitCTS.Token), parallelUnitCTS.Token); } }
改成下面这样就可以了。
foreach(var m in FlowItemListP) { if (m.RunModeF == MotionFlowItemRunMode.串行) { serailTaskFactory.StartNew(() => m.Run(serialUnitCTS.Token), serialUnitCTS.Token); } else if (m.RunModeF == MotionFlowItemRunMode.并行) { parallelTaskFactory.StartNew(() => m.Run(parallelUnitCTS.Token), parallelUnitCTS.Token); } }
之所以好了,是因为没有用到变量i
这个问题其实是lambda表达式的一个副作用。特别在循环里面用lambda表达式传递id变量要特别注意这个问题。
而这里之所以用lambda表达式,是为了StartNew()调用带参数的Run()函数。如果不用lambda表达式,还真不知道该怎么写。
恰好在网上看到一个人的提问。回答者也提醒了要注意的这个问题。
摘录如下:
----------------
我有以下代码:
var task = Task.Factory.StartNew(CheckFiles, cancelCheckFile.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); private void CheckFiles() { //Do stuff }
我现在想修改CheckFiles以接受和整数以及BlockingCollection引用
private void CheckFiles(int InputID, BlockingCollection<string> BlockingDataCollection) { //Do stuff }
我似乎找不到一个方法来开始这个任务,就像我上面所做的。
你能帮我吗?
谢谢
回复如下:
最好的选择是使用一个lambda表达式来关闭你想要显示的变量。
但是,在这种情况下要小心,特别是如果你在循环中调用这个。 (我提到这一点,因为你的变量是一个“ID”,这在这种情况下是常见的。)如果你在错误的范围内关闭变量,你可以得到一个错误。有关详细信息,请参阅Eric Lippert’s post on the subject.这通常需要进行临时:
foreach(int id in myIdsToCheck) { int tempId = id; // Make a temporary here! Task.Factory.StartNew( () => CheckFiles(tempId, theBlockingCollection), cancelCheckFile.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); }
另外,如果你的代码和上面一样,你应该小心使用LongRunning提示 – 使用默认调度器,这将导致每个任务获得自己的专用线程,而不是使用ThreadPool。如果你创建了很多任务,这可能会产生负面影响,因为你不会得到ThreadPool的优势。它通常适用于一个单一的,长时间运行的任务(因此它的名称),而不是将被实现来处理集合的项目等。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

