如何让主线程挂起并等待System.Timer.Timer运行

时间:2010-05-20 03:24:56

标签: c#

您好我正在使用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;
  }
}

4 个答案:

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