您好我正在使用System.Timer.Timer
运行程序后我总是得到NULL,只有添加this.sleep(6000)才能生效。假设原因是主线程结束但计时器尚未完成... 这是课程,我从我的主要表格中调用该课程。
Class class1
{
string finalResult = "";
public string getNumber()
{
RunTimer();
return finalResult;
}
pubic void RunTimer ()
{
timer = new System.Timers.Timer(30000);
timer.Interval = 1000;
timer.Elapsed += new System.Timers.ElapsedEventHandler(cal);
timer.Start();
}
private void cal(object sender,System.Timers.ElapsedEventArgs e)
{
finalResult += READFROMCOMPORT;
}
}
答案 0 :(得分:3)
为什么要在此实例中使用计时器?
如果您希望这是一个同步操作并等待finalresult被填充,您可以等待6秒再返回READFROMCOMPORT。
编辑:如果您需要程序继续运行,则可以在实例化类之后创建绑定的回调事件。计时器到期后,您可以提高回调事件并传递新值
编辑2:实现此类异步的一种简单方法是使用BackgroundWorker组件。 backgroundworker有一个DoWork()方法,它包含你的异步代码,以及一个“RunWorkerCompleted”回调事件,你可以订阅它以获得你的异步结果。有关详细信息,请参阅此处:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
答案 1 :(得分:3)
一个好的经验法则是永远不要在生产代码中使用Thread.Sleep
。它的存在通常表明不良的线程设计。
相反,请收听COM端口的DataReceived
事件。
答案 2 :(得分:0)
如果您已经从GUI的单独线程调用GetNumber(),则抛弃计时器,在GetNumber()中执行工作,线程将提前停止返回。在任何情况下,不要使用Thread.Sleep,因为如果需要,或者如果应用程序退出,则无法解除阻止。请改用Monitor.Wait,可以使用Monitor.Pulse解锁。
答案 3 :(得分:0)