使用参数 c 运行并行任务#

Parallel Task Run with argument c#

提问人:Sanman Chavan 提问时间:10/18/2020 更新时间:10/18/2020 访问量:158

问:

我需要并行执行几个过程,但主要问题是,我将参数传递给该过程
。 该过程有两个子任务 =>

  1. 调用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);

c# 并行处理 参数传递

评论

1赞 Nyerguds 10/18/2020
new List < Action > ()- 你那里有一些非常奇怪的间距......

答:

3赞 Caius Jard 10/18/2020 #1

在循环中,你有

offset = offset + 1;

在此行之后立即创建一个新变量

int x = offset;

并在调用中将该新变量传递给 GetMoreData,而不是xoffset

GetMoreData(..., offset); //no
GetMoreData(..., x);      //yes

简而言之,您的所有委托都在查看同一个变量,该变量现在的值为 5,因为这是循环的 N 次迭代后的结果。