【问题标题】:Trying to change UI control property from different thread using . InvokeRequired尝试使用 .调用必填
【发布时间】:2012-09-13 01:24:00
【问题描述】:

我在这里做错了什么?

我的计划是从不同的线程更改标签文本属性,而不会出现“跨线程操作无效”异常。

    private void button1_Click(object sender, EventArgs e)
    {
        Thread thread1 = new Thread(new ThreadStart(ChangeTime));
        thread1.Start();
    }

    delegate void SetTimeDelegate();

    private void ChangeTime()
    {
        while (true)
        {
            if (lbl1.InvokeRequired)
            {
                SetTimeDelegate setTime = new SetTimeDelegate(ChangeTime);
                lbl1.Invoke(setTime);


            }
            else
            {
                lbl1.Text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss tt");
                Thread.Sleep(1000);
            }
        }
    }

【问题讨论】:

  • 看起来你没有调用。老实说,我不知道你想在这里做什么。
  • 我正在尝试将文本从表单的标签更改为从新线程调用的当前日期时间
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。

标签: c# .net multithreading


【解决方案1】:

要从不同的线程更新 UI 控件,您需要调用 BeginInvokeInvoke 方法。您可以使用特定控件的方法或表单的方法。

您的原始代码具有无限递归。除了您的委托调用相同的方法外,您正在正确调用。创建一个单独的方法来随时间更新标签,并让委托调用该新方法。

private bool _IsShuttingDown = false;

private void ChangeTime()
{
   while (!_IsShuttingDown)
   {
      if (lbl1.InvokeRequired)
      {
         SetTimeDelegate setTime = new SetTimeDelegate(UpdateTimeLabel);
         lbl1.Invoke(setTime);
         Thread.Sleep(1000);
      }
      else
      {
         UpdateTimeLabel();
         Thread.Sleep(1000);
      }
   }
}

private void UpdateTimeLabel()
{
   lbl1.Text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss tt");
}

protected override void OnClosing(CancelEventArgs e)
{
   _IsShuttingDown = true;
   base.OnClosing(e);
}

我还在表单上添加了一个字段,以在表单关闭或发生奇怪的事情时退出循环。

我的原始代码:

if (lbl1.InvokeRequired)
{
    lbl1.Invoke((Action)(() => lbl1.Text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss tt")));
    Thread.Sleep(1000);
}

【讨论】:

  • 效果很好,我没有完全理解这个演员阵容
  • @EdwinSnts 我更改了代码以更好地适应您的原始代码。转换为 Action 所做的一切就是让它表现得像一个代表。
  • 这很有帮助,我曾经声明一个委托并在需要从不同线程更新控件时调用它,但如果您尝试更新多个控件,这也很有用
猜你喜欢
  • 2014-01-02
  • 1970-01-01
  • 2021-12-01
  • 2021-06-22
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多