【问题标题】:Parallel.ForEach with tuple return c#Parallel.ForEach 与元组返回 c#
【发布时间】:2017-07-22 19:20:33
【问题描述】:

基于此example,我正在尝试使用元组返回进行并行 foreach。

double min = double.MaxValue;

object syncObject = new object(); 
Parallel.ForEach(collection, () => double.MaxValue, (item, loopState, 
    localState) =>
    {
        double value = item.PerformComputation();
        return System.Math.Min(localState, value);
    },
    localState =>
    {
        lock(syncObj)
            min = System.Math.Min(min, localState);
    }
);

Console.Write(min + "\n");

上面的代码工作正常,但在我的情况下(正确的最小值),但我不想输出最小值而是那个值的“名称”,所以我尝试了这样的事情:

double min = double.MaxValue;
string minName = "";

object syncObject = new object(); 
Parallel.ForEach(collection, () => Tuple.Create(double.MaxValue, ""), (item, 
    loopState, localState) =>
    {
        double value = PerformComputation(item.Item1.Value);
        string name = item.Item1.Key;

        return //helpHere
    },
    localState =>
    {
        lock(syncObj)
            min = //help here
            minName = //help here
    }
);

Console.Write(minName + "\n");

尝试了一些不起作用的方法。我也没有运气读过microsoft's example。 任何帮助表示赞赏。

【问题讨论】:

    标签: c# multithreading foreach parallel-processing


    【解决方案1】:

    您的问题没有太多上下文。你最好提供一个好的Minimal, Complete, and Verifiable code example 来准确显示你在做什么。但是,它似乎好像在您的代码的第二个版本中,您已将计算模型从具有PerformComputation() 方法的对象更改为本地定义的PerformComputation() 方法,以及某种Tuple 对象的集合,其中Item1 成员是某种KeyValuePair<TKey, TValue>

    做出这些假设,这样的事情应该适用于您的场景:

    Tuple<double, string> result = Tuple.Create(double.MaxValue, "");
    
    object syncObject = new object(); 
    Parallel.ForEach(collection, () => Tuple.Create(double.MaxValue, ""),
        (item, loopState, localState) =>
        {
            double value = PerformComputation(item.Item1.Value);
    
            if (value < localState.Item1)
            {
                localState = Tuple.Create(value, item.Item1.Key);
            }
    
            return localState;
        },
    
        localState =>
        {
            lock(syncObj)
            {
                if (localState.Item1 < result.Item1)
                {
                    result = localState;
                }
            }
        }
    );
    

    【讨论】:

    • 非常感谢。它帮助了我,我解决了我的问题。很抱歉没有正确提供我的代码示例,净时间我会知道的。
    【解决方案2】:

    我不太确定我是否理解该示例,但使用 PLINQ 应该更容易:

    string minName = collection.AsParallel()
         .Min(item => Tuple.Create(PerformComputation(item.Item1.Value), item.Item1.Key)).Item2;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 2016-12-04
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多