0

我在 c# 上编写了一个小应用程序,以使用以太网协议读取一些 plc 数据。以太网套接字、打开和关闭存储在 .dll 库中。现在,我使用这个公共方法:

    public static string readdata()
    {
      try
      {
        ...
        return (plcdata());
      }
      catch
      {}
    }

我的疑问:如果 plcdata() (这是一个 .dll 的方法)等待几秒钟(例如慢速通信......)我的应用程序可能会被冻结。

所以,我尝试在返回的字符串上添加一个 EventHandler,如下所示:

    private static TextBox auxDataTextBox = new TextBox();

    public static void goRead()
    {            
        auxDataTextBox.TextChanged += new EventHandler(auxDataIncoming);
        auxDataTextBox.Text = plcdata();
    }

    private static void auxDataIncoming(object sender, EventArgs e)
    {      
        // Do something
    }

在这种情况下,当“plcdata()”改变时,auxDataIncoming 将被提升。它是正确的?还是更好地进行超时控制?还是新建线程?

非常感谢您的意见

4

2 回答 2

3

您的更改不会产生影响,它仍然在 UI 线程上运行。要进行plcdata()非阻塞调用,您需要在另一个线程上触发它,例如

private static TextBox auxDataTextBox = new TextBox();

public static void goRead()
{            
    auxDataTextBox.TextChanged += new EventHandler(auxDataIncoming);
    Task.Factory.StartNew(() => { 
        return plcData(); 
    }).ContinueWith(task => {
        auxDataTextBox.Text = task.Result;
    }, null, TaskContinuationOptions.NotOnFaulted, TaskScheduler.FromCurrentSynchronizationContext());
}


private static void auxDataIncoming(object sender, EventArgs e)
{      
    // Do something
}
于 2013-09-24T11:53:16.070 回答
1

这不会解冻您的应用程序。效果将完全相同。这是因为您仍在 UI 线程上运行 plcdata。

您设置的整个事件结构根本没有意义。

您应该研究多线程。一个非常简单的方法是使用BackgroundWorker

于 2013-09-24T11:53:56.430 回答