winform表单变得无响应

本文关键字:响应 表单 winform | 更新日期: 2023-09-27 17:58:52

我正在启动一个线程并更新表单元素,但下面的代码使表单无法解析,请说明我在这里做错了什么。

    private void StartTimer()
    {
        Thread t = new Thread(Updates);
        t.IsBackground = true;
        t.Start();
    }
    private void Updates()
    {
        try
        {
            while (true)
            {
                this.Invoke((MethodInvoker)delegate
                    {
                        lblTotalImages.Text = AppHelper.GetTotalCount(textBox1.Text).ToString();
                        if (sitename != null)
                        {
                            lblTotalPosted.Text = AppHelper.GetPostedCount(sitename).ToString();
                           // Application.DoEvents();
                        }
                    });
                Thread.Sleep(1000);
            }
        }
        catch (Exception ex)
        {
        }
    }

编辑-------感谢@Servy介绍了我从未使用过的任务并行库,这是我使用计时器和任务工厂提出的解决方案ya for.net 4没有库扩展,与2010年相比,我有这个工作完美的

enter code here private void timer1_Tick(object sender, EventArgs e)
    {
        Task.Factory.StartNew(() => AppHelper.GetTotalCount(textBox1.Text)).ContinueWith(t => lblTotalImages.Text = t.Result.ToString(), TaskScheduler.FromCurrentSynchronizationContext());
        if (sitename != null)
        {
            Task.Factory.StartNew(() => AppHelper.GetPostedCount(sitename)).ContinueWith(t => lblTotalPosted.Text = t.Result.ToString(), TaskScheduler.FromCurrentSynchronizationContext());

        }

    } 

winform表单变得无响应

您正在对Invoke的调用中执行某种长时间运行的非UI操作,这意味着它是在UI线程中完成的。您应该努力只更新UI线程中的UI;确保任何长时间运行的非UI代码都在对UI线程的任何调用之外。

await的使用也使这个解决方案能够以更简单、更有效的方式编写:

public async void StartTimer()
{
    while (true)
    {
        string text = textBox1.Text;
        lblTotalImages.Text = await Task.Run(() =>
            AppHelper.GetTotalCount(text).ToString());
        if (sitename != null)
        {
            lblTotalPosted.Text = await Task.Run(() =>
                AppHelper.GetPostedCount(sitename).ToString());
        }
        await Task.Delay(TimeSpan.FromSeconds(1));
    }
}