【发布时间】:2013-08-29 06:24:20
【问题描述】:
通过查看Divide Foreach into threads sample 中指定的此解决方案
我尝试用这段代码实现它:
foreach (Object vo in arrreclist)
{
msg = String.Empty;
objprocess.GetType().GetMethod("ProcessRecord").Invoke(objprocess, new Object[] { vo });
status = (StatusInfo)objprocess.GetType().GetProperty("status").GetValue(objprocess, null);
if (status.errcode != 0)
{
lngfailedcnt++;
WriteErrorLog();
}
else
{
lngsuccesscnt++;
lngInstanceSuccCount++;
}
lngcnt++;
if ((lngcnt % 10) == 0)
{
if (instanceId == 0)
{
schldr.ModifyJobhistoryForUploadFileRecCnt(Runid, (int)lngTotreccnt, lngfailedcnt, (int)(lngfailedcnt + lngsuccesscnt));
}
else
{
schldr.ModifyJobhistoryForUploadFileRecCnt(Runid, 0, lngfailedcnt, (int)(lngfailedcnt + lngsuccesscnt));
}
status = schldr.status;
if (status.errcode != 0)
{
if (!String.IsNullOrEmpty(Errorlogfile))
WriteErrorLog();
holdInstance = true;
break;
}
//Get Job Status
//If job was terminated then Update Batch and Job history with status as STOPPED
intstatus = schedulersvc.GetJobStatus(Runid);
status = schedulersvc.status;
if (status.errcode != 0)
{
WriteErrorLog();
holdInstance = true;
break;
}
if (intstatus == 1) //STOPPED
{
holdInstance = true;
break;
}
lngcnt = 0;
}
}
break 语句出现错误消息:
不能离开匿名方法或 lambda 表达式的主体
我的主要任务是并行化以下行:
objprocess.GetType().GetMethod("ProcessRecord").Invoke(objprocess, new Object[] { vo })
但是其他的都是依赖,怎么实现呢?
【问题讨论】:
-
首先你为什么要使用反射?相反,你为什么不定义一个接口并使用 Parallel.ForEach
-
您的错误与您发布的代码不匹配:我在那里看不到任何 lambdas。
-
另外,当您说您只想并行化该行时,这是否意味着循环的其余部分不能并行运行?
-
@svick 我没有在帖子中发布并行化代码,还考虑使用 parallel.foreach 使上述代码并行运行,但不支持数组列表,我认为状态不是线程安全的在循环中获取 objprocess 的状态,所以可能是另一种方式,然后上线,因为该特定行调用了一个需要更多时间的方法,所以我想并行运行它
标签: c# asp.net multithreading parallel.foreach