问题描述
我需要并行执行一些流程,但是主要的问题是,我正在将参数传递给该流程
。
该过程有两个子任务=>
private void GetMoreData(some arguments) { //calling in 2-3 times Parallel
Monitor.Enter(_object);
long ? maxSearchResults = 0;
string shopKey = string.Empty;
long ? offSet = 0;
long ? pageSize = 200;
try {
List < Action > delegates = new List < Action > ();
if (maxSearchResults != null) {
double value = double.Parse((maxSearchResults / pageSize).ToString());
iteratorLength = int.Parse(Math.Round(value,MidpointRounding.AwayFromZero).ToString());
//some logic to to get no of times we need to call loops
for (int iterator = 0; iterator < iteratorLength; iterator++) {
offSet = offSet + 1;
delegates.Add(() = >{
ProcessData(arguments.....,offSet);
});
}
}
Parallel.Invoke(delegates.ToArray());
}
catch(Exception ex) {
//throw new Exception....
}
finally {
Monitor.Exit(_object);
}
}
在上面的示例中,如果我们要调用5个循环,
但是当我调试委托数组时,我发现如下所示
GetMoreData(arguments .....,same_shopKey,offSet:5);
GetMoreData(arguments .....,same_shopKey,offSet:5);
GetMoreData(arguments .....,same_shopKey,offSet:5);
GetMoreData(arguments .....,same_shopKey,offSet:5);
代表应该这样工作(我想实现这一目标)==>
GetMoreData(arguments .....,same_shopKey,offSet:2);
GetMoreData(arguments .....,same_shopKey,offSet:3);
GetMoreData(arguments .....,same_shopKey,offSet:4);
GetMoreData(arguments .....,same_shopKey,offSet:5);
解决方法
在循环中,您在哪里
offset = offset + 1;
在此行之后立即创建一个新变量
int x = offset;
并在调用GetMoreData而不是x
时将新变量offset
传递给
GetMoreData(...,offset); //no
GetMoreData(...,x); //yes
简而言之,您的所有代表都在查看 same 变量,该变量现在具有值5,因为它是循环N次迭代后的值。