C#使用kepware的速度非常慢

C#使用kepware的速度非常慢,c#,multithreading,winforms,plc,C#,Multithreading,Winforms,Plc,我有一个C#form应用程序,通过Kepware OPC服务器与PLC通信。 但是这种通信减慢了我的GUI。我使用线程进行通信,但表单页仍然非常慢。我正在发送我的部分代码。我错在哪里 public Form1() { InitializeComponent(); Connect_Opc_Server("Kepware.KEPServerEX.V5"); ConnectToSqlToRead(); ShowPartType(1); } private vo

我有一个C#form应用程序,通过Kepware OPC服务器与PLC通信。 但是这种通信减慢了我的GUI。我使用线程进行通信,但表单页仍然非常慢。我正在发送我的部分代码。我错在哪里

public Form1()
{
     InitializeComponent();
     Connect_Opc_Server("Kepware.KEPServerEX.V5");
     ConnectToSqlToRead();
     ShowPartType(1);
}

private void timer_Kepware_Tick(object sender, EventArgs e)
{
     Thread KepwareThread = new Thread(new ThreadStart(Kepware_Read_Write));
     if (KepwareThread.IsAlive)
     { }
     else
     {
         KepwareThread.Start();
     }
 }

public void Kepware_Read_Write()
{
    if (KepwarePLCReadError == false)
    {
        synch_read();
    }

    if (KepwarePLCReadOK == true)
    {
        synch_write();
    }           
}

您可能只想创建一个线程

private void timer_Kepware_Tick(object sender, EventArgs e)
{
    if (_KepwareThread == null)
    {
        _KepwareThread = new Thread(...);
    } 
    if (!_KepwareThread.IsAlive) 
    {
        _KewpareThread.Start();
    }
 }

您的
tick
事件多长时间被触发一次?您应该使用订阅API和数据更改回调来获取数据,轮询非常高效。我在应用程序中使用Kepware和TopServer(与Kepware相同)有很多经验。您最好使用。它更易于使用和故障排除,设计用于WinForms应用程序。每100毫秒一次。是的,因为线程从plc读取所有数据,之后它将停止运行。您可以删除
布尔值的冗余比较:
如果(KepwarePLCReadOK==true)
只是
如果(KepwarePLCReadOK)
,并且
如果(KepwarePLCReadError==false)
如果(!KepwarePLCReadError)
我认为它需要看起来像
如果(_KepwareThread==null){u KepwareThread=new Thread(…);}如果(!_KepwareThread.IsAlive){u KepwareThread.Start();}
true-我之前看到过它,知道我需要修复它。