winforms 这是使用invoke函数的正确方法吗?

2cmtqfgy  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(100)

我想不断刷新我的表单以更新表单上显示的信息。并且不想程序崩溃。当我在网上寻找答案时,当我得到答案时,我不得不使用一个函数“Control.Invoke”。在那之后我写了以下代码。

private void Form1_Load(object sender, EventArgs e)
    {
            Thread Data = new Thread(RefreshData) { IsBackground = true };
            Data.Start();
    }

    void RefreshData()
    {
        while (true)
        {
            //...rewrite all data display on form
            this.Invoke((MethodInvoker)delegate { this.Refresh(); });
            Thread.Sleep(33);
        }
    }

这是使用invoke函数的正确方法吗?

xxb16uws

xxb16uws1#

是的,您可以这样使用Invoke,但是我建议您避免手动创建线程。
相反,可以使用较新的asyncTask.Run特性。您也可以使用更短的语法编写匿名lambda,尽管它的结果是一样的。

private void Form1_Load(object sender, EventArgs e)
{
    Task.Run(RefreshData);
}

async Task RefreshData()
{
    while (!this.IsDisposed)
    {
        // await stuff here??
        //...rewrite all data display on form
        this.Invoke((MethodInvoker)() => this.Refresh());
        await Task.Delay(33);
    }
}

另一种选择是允许任务调度程序将延续封送回UI线程。

private void Form1_Load(object sender, EventArgs e)
{
    Task.Run(RefreshData);
}

async void RefreshData()
{
    while (!this.IsDisposed)
    {
        await Task.Run(RefreshDataInternal);
        this.Refresh();
        await Task.Delay(33);
    }
}

async Task RefreshData()
{
    // await stuff here
    // Do NOT call the UI
}

相关问题