我对这一切都很陌生,所以请耐心等待!我正在写一个小应用程序来控制我的望远镜,此刻我可以连接它并告诉它在哪里指向。我希望有几个文本框,或者用望远镜位置不断更新的标签 - T
是望远镜对象,我打电话给T.Altitude
,T.Azimuth
,T.RightAscention
和T.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 :(得分:2)
在您的情况下,您应该考虑使用其中一个Timer类。这些类以指定的间隔调用给定的委托。
Windows.Forms命名空间中的Timer类在UI线程中调用委托,因此您不必为调度或任何事情而烦恼,但如果您经常调用它,可能会降低UI的响应速度。
其他计时器使用单独的线程,因此您需要使用Dispatcher对象或SynchronizationContext对象来修改UI值。你可以在msdn上阅读更多关于这些的信息。
答案 1 :(得分:1)
最简单的方法可能是建议使用Windows.Forms.Timer定期使用Telescope(对象)中的当前值更新Gui。
作为旁注,后台工作程序在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();
}
}