2010-05-20 166 views
0

嗨,我使用System.Timer.Timer我如何让主线程暂停,等待System.Timer.Timer运行

我总是NULL运行我的程序后,如果我添加此它才有效。睡眠(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

制造它30秒 – Kelvin 2010-05-20 03:34:51

回答

3

为什么要在这种情况下使用计时器?

如果您希望这是一个同步操作并等待finalresult被填充,您可以在返回READFROMCOMPORT之前等待6秒钟。

编辑:如果您需要程序继续运行,您可以创建一个回调事件,在实例化该类后绑定到该事件。一旦定时器到期,您可以提高回调事件并传递新值

编辑2:实现这种异步的简单方法是使用BackgroundWorker组件。 backgroundworker有一个DoWork()方法,它包含你的异步代码,以及一个“RunWorkerCompleted”回调事件,你可以订阅它来获得你的异步结果。请参阅这里了解更多信息:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

+0

如果我使整个程序睡眠,用户失去所有的controlls。等待时间可能会超过6秒,如30。 我认为这不是一个很好的解决方案,让主线程睡眠30秒 – Kelvin 2010-05-20 03:33:25

+0

然后,如果可以的话,您必须在另一个线程上调用整个事件。一旦你运行定时器,主线程就会返回,所以无论如何,你不会让你的值返回,除非你让它们都离开主线程,这样你就可以将它们合并成一个线程,或者让线程2等待线程3(这显然没有多大意义) – 2010-05-20 03:39:59

+0

您还可以使用回调,请参阅我的编辑 – 2010-05-20 03:42:12

3

一个很好的经验法则是从不在生产代码中使用Thread.Sleep。它的存在通常表明线程设计不佳。

取而代之的是,收听COM端口的DataReceived事件。

+0

但是数据会连续发送到COM端口,这就是为什么我需要一个计时器来每秒钟收听端口。 – Kelvin 2010-05-20 22:54:27

+0

或者您可以只响应'DataReceived',这会在更多数据到达时触发。不需要定时器。 – 2010-05-20 23:22:32

0

如果您已经从GUI中的单独线程调用GetNumber(),请关闭计时器,在GetNumber()中执行该操作,并且线程将提前停止返回。在任何情况下,请勿使用Thread.Sleep,因为如果需要,无法解锁它,或者应用程序退出。相反,使用Monitor.Wait,可以使用Monitor.Pulse解除阻止。