Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取后台任务以不断更新文本框_C#_.net_Backgroundworker - Fatal编程技术网

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

C# 获取后台任务以不断更新文本框,c#,.net,backgroundworker,C#,.net,Backgroundworker,我对这一切都很陌生,所以请容忍我!我正在写一个小程序来控制我的望远镜,现在我可以连接到它并告诉它指向哪里。我想有两个文本框,或者标签,它们会随着望远镜的位置不断更新-T是望远镜的目标,我要调用T.altime,T.aziration,T.rightsception和T.Declination,我希望这些值每隔半秒左右更新四个标签。我假设我需要使用后台工作人员,但我说的对吗?既然望远镜物体是在主线程上创建的,我能访问它吗?我到底是怎么做到的!这就是我到目前为止所拥有的(而且并不多!) 在你的情况下

我对这一切都很陌生,所以请容忍我!我正在写一个小程序来控制我的望远镜,现在我可以连接到它并告诉它指向哪里。我想有两个文本框,或者标签,它们会随着望远镜的位置不断更新-
T
是望远镜的目标,我要调用
T.altime
T.aziration
T.rightsception
T.Declination
,我希望这些值每隔半秒左右更新四个标签。我假设我需要使用后台工作人员,但我说的对吗?既然望远镜物体是在主线程上创建的,我能访问它吗?我到底是怎么做到的!这就是我到目前为止所拥有的(而且并不多!)


在你的情况下,你应该考虑使用一个定时器类。这些类在指定的时间间隔内调用给定的委托

Windows.Forms命名空间中的Timer类调用UI线程中的委托,因此您不必为分派或任何事情而烦恼,但如果您调用太频繁,则可能会降低UI的响应速度


其他计时器使用单独的线程,因此您需要使用Dispatcher对象或SynchronizationContext对象来修改UI值。您可以阅读更多有关msdn的信息。

最简单的方法可能是建议使用一个工具,使用望远镜(对象)的当前值定期更新Gui

另一方面,在C#5.0中,后台工作程序有点过时,因为使用async/await更容易(请参阅)

下面是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();
    }
}

你可以找到一个关于BackgroundWorker的好教程。希望这有帮助。
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();
    }
}