我在c#上写了一个小应用程序,用以太网协议读取一些plc数据。以太网套接字,打开和关闭存储在.dll库中。 现在,我使用这种公共方法:
public static string readdata()
{
try
{
...
return (plcdata());
}
catch
{}
}
我的疑问:如果plcdata()(这是一个.dll的方法)等待几秒钟(对于istance slow comunication ......)我的申请可能会被冻结。
所以,我尝试在返回的字符串上添加一个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将被提升。 它是正确的?或者更好地进行超时控制?或者制作新帖子?
非常感谢你的意见
答案 0 :(得分: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
}
答案 1 :(得分:1)