EventHandler与Timeout

时间:2013-09-24 11:47:13

标签: c#

我在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将被提升。 它是正确的?或者更好地进行超时控制?或者制作新帖子?

非常感谢你的意见

2 个答案:

答案 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)

这不会解冻你的申请。效果将完全相同。这是因为您仍然在UI线程上运行plcdata。

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

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