提问人:Sanman Chavan 提问时间:10/18/2020 更新时间:10/18/2020 访问量:158
使用参数 c 运行并行任务#
Parallel Task Run with argument c#
问:
我需要并行执行几个过程,但主要问题是,我将参数传递给该过程
。
该过程有两个子任务 =>
- 调用API 2.保存DB中API的响应
//calling in this function ProcessData(arguments....., shopKey, offSet);
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....., shopKey, offSet);
});
}
}
Parallel.Invoke(delegates.ToArray());
}
catch(Exception ex) {
//throw new Exception....
}
finally {
Monitor.Exit(_object);
}
}
在上面的例子中,如果我们调用 5 个循环,
但是当我调试委托数组时,我发现如下所示
GetMoreData(参数....., same_shopKey, offSet:5);
GetMoreData(参数....., same_shopKey, offSet:5);
GetMoreData(参数....., same_shopKey, offSet:5);
GetMoreData(参数....., same_shopKey, offSet:5);
代表应该这样工作(我想实现这个)==>
GetMoreData(参数....., same_shopKey, offSet:2);
GetMoreData(参数....., same_shopKey, offSet:3);
GetMoreData(参数....., same_shopKey, offSet:4);
GetMoreData(参数....., same_shopKey, offSet:5);
答:
3赞
Caius Jard
10/18/2020
#1
在循环中,你有
offset = offset + 1;
在此行之后立即创建一个新变量
int x = offset;
并在调用中将该新变量传递给 GetMoreData,而不是x
offset
GetMoreData(..., offset); //no
GetMoreData(..., x); //yes
简而言之,您的所有委托都在查看同一个变量,该变量现在的值为 5,因为这是循环的 N 次迭代后的结果。
评论
new List < Action > ()
- 你那里有一些非常奇怪的间距......