Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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# 并行任务比单个任务耗时更长_C#_Parallel.foreach - Fatal编程技术网

C# 并行任务比单个任务耗时更长

C# 并行任务比单个任务耗时更长,c#,parallel.foreach,C#,Parallel.foreach,我正在尝试创建并行任务。任务调用相同的方法。方法正在处理一些值 以下是示例代码: private OpcClient client = new OpcClient(); private void starttask() { client = new OpcClient("opc.tcp://172.16.100.1:55105"); client.Connect(); List<string> mytask = ne

我正在尝试创建并行任务。任务调用相同的方法。方法正在处理一些值

以下是示例代码:

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;
    }
private OpcClient client=new OpcClient();
私有无效starttask()
{
客户端=新的opc客户端(“opc。tcp://172.16.100.1:55105");
client.Connect();
List mytask=new List();
mytask.Add(“process1”);
mytask.Add(“process2”);
Parallel.For(0,2,新的ParallelOptions{MaxDegreeOfParallelism=2},i=>
{
mymethod(mytask[i]);
});
}
私有字符串mymethod(字符串节点)
{
OpcNodeInfo machineNode=client.BrowseNode(节点);
字符串val=”“;
foreach(machineNode.Children()中的var childNode)
{
字符串_node=childNode.NodeId.ValueAsString;
val=client.ReadNode(“ns=6;s=“+_node).ToString();
Console.WriteLine(“Value=“+val”);
}
返回val;
}
问题是,当我在没有任务的情况下调用这个方法时,处理过程需要7秒,但是并行调用这个方法需要两倍多一点的时间,所以说15秒。该方法正在处理task1和task2的相同数据,但来自不同的位置(地址)


为什么呢?不应该是两个任务同时完成,或者我遗漏了什么吗?

这似乎是IO限制的

PLC支持并发读取吗?听起来像是瓶颈

尝试从两个不同的可编程逻辑控制器读取数据,也可能获得更快的结果


如果您只是在mymethod()中添加一些虚拟计算(或Thread.Sleep()),您将看到它并行运行得更快。

我们需要有关您在mymethod()中所做操作的更多信息。请提供一个链接。@Macke mymethod()正在使用OPC UaFX lib从PLC读取数据。