【问题标题】:Parallel Task Run with argument c#使用参数 c# 运行并行任务
【发布时间】:2020-10-18 07:09:00
【问题描述】:

我需要并行执行一些流程,但主要关注的是,我正在将参数传递给该流程
。 该流程有两个子任务 =>

  1. 调用 API 2.将来自 API 的响应保存到 DB //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(arguments....., same_shopKey, offSet:5);

代表应该这样工作(我想实现这个)==>

GetMoreData(参数....., same_shopKey, offSet:2);
GetMoreData(参数....., same_shopKey, offSet:3);
GetMoreData(参数....., same_shopKey, offSet:4);
GetMoreData(arguments....., same_shopKey, offSet:5);

【问题讨论】:

  • new List &lt; Action &gt; () - 你有一些非常奇怪的间距...
  • 您是否考虑过使用Partitioner,而不是手动进行分区?你可以这样使用它:Parallel.ForEach(Partitioner.Create(0, maxSearchResults, pageSize), range =&gt; {...

标签: c# parallel-processing parameter-passing


【解决方案1】:

在循环中,你有

offset = offset + 1;

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

int x = offset;

并在调用 GetMoreData 时将新变量 x 传递给 offset

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

简而言之,您的所有代表都在查看 same 变量,该变量现在的值为 5,因为这是循环 N 次迭代后的值。

【讨论】:

    猜你喜欢
    • 2016-02-28
    • 1970-01-01
    • 2014-07-20
    • 2012-11-02
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多