并行任务比单个任务需要更长的时间
Parallel task takes longer than single task
我正在尝试创建并行任务。任务调用相同的方法。方法正在处理一些值。
示例代码如下:
private OpcClient client = new OpcClient();
private void starttask()
{
client = new OpcClient("opc.tcp://172.16.100.1:55105");
client.Connect();
List<string> mytask = new List<string>();
mytask.Add("process1");
mytask.Add("process2");
Parallel.For(0, 2, new ParallelOptions { MaxDegreeOfParallelism = 2 }, i =>
{
mymethod(mytask[i]);
});
}
private string mymethod(string node)
{
OpcNodeInfo machineNode = client.BrowseNode(node);
string val = "";
foreach (var childNode in machineNode.Children())
{
string _node = childNode.NodeId.ValueAsString;
val = client.ReadNode("ns=6;s=" + _node).ToString();
Console.WriteLine("Value = " + val);
}
return val;
}
问题是当我在没有任务的情况下调用此方法时,处理时间假设为 7 秒,但并行调用这需要两倍多一点,所以假设 15 秒。该方法正在为 task1 和 task2 处理相同的数据,但来自不同的地方(地址)...
这是为什么?不应该是两个任务是同时完成的还是我遗漏了什么?
这似乎是 IO 绑定。
PLC是否支持并发读取?听起来像是瓶颈。
尝试从两个不同的 PLC 读取,您也可能会更快地获得结果。
如果您只是在 mymethod() 中添加一些虚拟计算(或 Thread.Sleep()),您会发现它并行运行得更快。
我正在尝试创建并行任务。任务调用相同的方法。方法正在处理一些值。
示例代码如下:
private OpcClient client = new OpcClient();
private void starttask()
{
client = new OpcClient("opc.tcp://172.16.100.1:55105");
client.Connect();
List<string> mytask = new List<string>();
mytask.Add("process1");
mytask.Add("process2");
Parallel.For(0, 2, new ParallelOptions { MaxDegreeOfParallelism = 2 }, i =>
{
mymethod(mytask[i]);
});
}
private string mymethod(string node)
{
OpcNodeInfo machineNode = client.BrowseNode(node);
string val = "";
foreach (var childNode in machineNode.Children())
{
string _node = childNode.NodeId.ValueAsString;
val = client.ReadNode("ns=6;s=" + _node).ToString();
Console.WriteLine("Value = " + val);
}
return val;
}
问题是当我在没有任务的情况下调用此方法时,处理时间假设为 7 秒,但并行调用这需要两倍多一点,所以假设 15 秒。该方法正在为 task1 和 task2 处理相同的数据,但来自不同的地方(地址)...
这是为什么?不应该是两个任务是同时完成的还是我遗漏了什么?
这似乎是 IO 绑定。
PLC是否支持并发读取?听起来像是瓶颈。
尝试从两个不同的 PLC 读取,您也可能会更快地获得结果。
如果您只是在 mymethod() 中添加一些虚拟计算(或 Thread.Sleep()),您会发现它并行运行得更快。