2013-03-10 35 views
1

我對這一切都很新,所以請耐心等待!我正在寫一個小應用程序來控制我的望遠鏡,此刻我可以連接到它並告訴它在哪裏指向。我想要有幾個文本框,或者不斷更新望遠鏡位置的標籤 - T是望遠鏡對象,我打電話T.Altitude,T.Azimuth,T.RightAscentionT.Declination,我希望這些值每隔半秒更新四個標籤,或者所以。我假設我需要使用背景工作者,但我是否正確?我是否能夠在主線程上創建Telescope對象?我究竟該如何做到這一切!這是我迄今爲止(也不是很多!)...獲取後臺任務來不斷更新文本框

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 

    string Az = T.Azimuth.ToString(); 
    string Alt = T.Altitude.ToString(); 
    string Dec = T.Declination.ToString(); 
    string Ra = T.RightAscension.ToString(); 

    System.Threading.Thread.Sleep(500); 
} 
+0

你可以找到一個關於BackgroundWorker的好教程[這裏](http://www.c-sharpcorner.com/uploadfile/mahesh/backgroundworker-in-C-Sharp/)。希望這可以幫助。 – 2013-03-10 18:11:46

回答

2

在你的情況你應該考慮使用一個Timer類。這些類以指定的時間間隔調用給定的委託。

Windows.Forms命名空間中的Timer類在UI線程中調用委託,因此您不必擔心分派或任何事情,但是如果您經常調用UI,它可能會使UI的響應速度變慢。

其他計時器使用單獨的線程,因此您需要使用Dispatcher對象或SynchronizationContext對象來修改UI值。你可以閱讀關於msdn的更多信息。

1

最簡單的方法可能是建議使用Windows.Forms.Timer定期用您的望遠鏡(對象)中的當前值更新Gui。

作爲一個方面說明,Background Worker在C#5.0中已經過時了,因爲使用async/await更容易(請參閱this thread about async/await vs BackgroundWorker)。

這是WinForms中的一個示例實現,它每500毫秒刷新一組標籤。

public partial class MyForm : Form 
{ 
    private readonly Timer _timer = new Timer(); 

    public MyForm() 
    { 
     InitializeComponent(); 

     _timer.Interval = 500; 
     _timer.Tick += TimerTick; 
     _timer.Enabled = true; 
    } 

    void TimerTick(object sender, EventArgs e) 
    { 
     _labelAzimuth.Text = T.Azimuth.ToString(); 
     _labelAltitude.Text = T.Altitude.ToString(); 
     _labelDeclination.Text = T.Declination.ToString(); 
     _labelRightAscension.Text = T.RightAscension.ToString(); 
    } 
}