Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Parallel.ForEach不';不能在VS2013中编译,但可以在VS2015中工作_C#_Visual Studio 2013_Visual Studio 2015_Parallel.foreach - Fatal编程技术网

C# Parallel.ForEach不';不能在VS2013中编译,但可以在VS2015中工作

C# Parallel.ForEach不';不能在VS2013中编译,但可以在VS2015中工作,c#,visual-studio-2013,visual-studio-2015,parallel.foreach,C#,Visual Studio 2013,Visual Studio 2015,Parallel.foreach,我正在使用它来创建分区,并且在我的VS2015应用程序中工作得非常好。我尝试使用4.5.2 framework将代码移动到VS2013,但现在在这行代码中出现错误: VS2013 12.0.40629.00更新5 说 错误5委托“System.Func”不接受3个参数 我发现了这个问题:非常相似。但这似乎并不是同一个问题 建议的答案在2013年没有任何语法错误,但没有使用分区,因此我不确定如何使我的代码适应该语法错误。建议增加三个参数,我的已经有三个参数了 这是我的代码的简化版本: public

我正在使用它来创建分区,并且在我的VS2015应用程序中工作得非常好。我尝试使用4.5.2 framework将代码移动到VS2013,但现在在这行代码中出现错误:

VS2013 12.0.40629.00更新5

错误5委托“System.Func”不接受3个参数

我发现了这个问题:非常相似。但这似乎并不是同一个问题

建议的答案在2013年没有任何语法错误,但没有使用分区,因此我不确定如何使我的代码适应该语法错误。建议增加三个参数,我的已经有三个参数了

这是我的代码的简化版本:

public void NearLinkParallelGeneration(avl_range avl_pending)
{
    var parallelOptions = new ParallelOptions
    {
        MaxDegreeOfParallelism = Environment.ProcessorCount + 2
    };

    var partitions = Partitioner
                        .Create(
                            fromInclusive: avl_pending.begin,
                            toExclusive: avl_pending.end,
                            rangeSize: 100
                        )
                        .GetDynamicPartitions();

    Parallel.ForEach(
        source: partitions,
        parallelOptions: parallelOptions,
        localInit: () => 
        {
            NpgsqlConnection conn = new NpgsqlConnection(strConnection);
            NpgsqlCommand cmd = new NpgsqlCommand();

            conn.Open();

            return new { Connection = conn, Command = cmd };
        },
        body: (source, state, local) => -- HERE IS THE ERROR
        {
            return local;
        },
        localFinally: local =>
        {
            local.Connection?.Dispose();
            local.Command?.Dispose();
        }
    );

错误图像:

我没有安装VS2013,因此无法重现您的问题。然而,编译器似乎对选择哪个重载感到困惑

您正在复制的代码使用
ForEach()
方法的重载

您收到的错误消息表明编译器已为您的调用选择了重载。也就是说,预期代理不仅会接收当前项的
状态
本地
值,还会接收当前项的
索引

由于目前缺乏在VS2013中测试代码的能力,我不能完全确定编译器为什么选择了错误的重载。但我认为这有可能与上一节描述的问题有关。答案是,是的,这是一个编译器错误,因为延迟缓存出错,编译器的元数据过载

如果事实上是这样,您应该能够通过为lambda参数提供显式类型来解决这个问题。不幸的是,在本例中,您使用的是匿名类型作为
TLocal
type参数。所以您没有这个选项,除非您愿意声明要使用的命名类型而不是匿名类型

另一种选择是放弃,按照编译器的想法去调用重载。同样,我无法亲自测试,但我希望这会起作用:

Parallel.ForEach(
    source: partitions,
    parallelOptions: parallelOptions,
    localInit: () => 
    {
        NpgsqlConnection conn = new NpgsqlConnection(strConnection);
        NpgsqlCommand cmd = new NpgsqlCommand();

        conn.Open();

        return new { Connection = conn, Command = cmd };
    },
    body: (source, state, index, local) // just add the 'index' parameter
    {
        return local;
    },
    localFinally: local =>
    {
        local.Connection?.Dispose();
        local.Command?.Dispose();
    }
);

可能重复的可能重复的@twoleggedhorse你知道我已经链接了那个答案吗?我的代码已经在使用这三个参数了。但在这个答案中,我们不使用分区,而我的使用分区。所以我不知道如何将我的代码转换成那个。还有,我的代码已经在VS中运行了-2015@twoleggedhorse:您提议的副本甚至不涉及相同的方法。这个问题和答案属于
Parallel.For()
,而这个问题和答案属于
Parallel.ForEach()
。此外,该问题和答案涉及API的CTP(预览)版本中存在的方法重载,但在最终版本中被删除,而该问题涉及的方法重载确实存在,并且自API发布以来一直存在。请删除您的投票以关闭,因为提议的副本是一个错误的选择。不幸的是,它不起作用,现在说它不支持4个参数。对于2或1参数,也可以使用相同的方法。现在我在想也许我用的不是正确的Paraller.ForEach?也许我需要换一个推荐人?不知道这个帮助,但是VS say正在使用这个重载我不熟悉匿名类型,你能告诉我如何使他们命名类型吗?“VS say正在使用这个重载版本”--哪个VS版本这么说?该图像显示了您想要的过载,即。如果添加
索引
参数没有帮助,那么我猜您必须使用命名类型。您只需在方法本身之外声明一个类型,如
classcxcmd{public NpgsqlConnection{get;set;}public NpgsqlCommand{get;set;}
,然后在
localInit
lambda中,
返回新的CxCmd{Connection=conn,Command=cmd}
。你可以给命名类型起任何你想要的名字…为了方便,我只使用
CxCmd
。我在家里使用VS 2013,在办公室使用VS 2015。
Parallel.ForEach(
    source: partitions,
    parallelOptions: parallelOptions,
    localInit: () => 
    {
        NpgsqlConnection conn = new NpgsqlConnection(strConnection);
        NpgsqlCommand cmd = new NpgsqlCommand();

        conn.Open();

        return new { Connection = conn, Command = cmd };
    },
    body: (source, state, index, local) // just add the 'index' parameter
    {
        return local;
    },
    localFinally: local =>
    {
        local.Connection?.Dispose();
        local.Command?.Dispose();
    }
);