获取后台任务以不断更新文本框

时间:2013-03-10 17:46:49

标签: c# .net backgroundworker

我对这一切都很陌生,所以请耐心等待!我正在写一个小应用程序来控制我的望远镜,此刻我可以连接它并告诉它在哪里指向。我希望有几个文本框,或者用望远镜位置不断更新的标签 - T是望远镜对象,我打电话给T.AltitudeT.AzimuthT.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);
}

2 个答案:

答案 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();
    }
}