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