2010-05-20 123 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解除阻止。