文本未从另一个线程更新

时间:2015-01-27 12:24:43

标签: c# winforms coded-ui-tests

我正在尝试从另一个线程获取一个简单的标签值,并且已经尝试了3种不同的线程机制(任务,线程,后台工作者),现在我不知道为什么控件不会更新。

我在这样一个不相关的类中有一个方法:

 public static void SetOverlayText(string text, bool fade = false)
      {
         Thread myThread = new Thread(FadeOverlayText);
         OverlayForm.SetLabelText(text);

         if (fade)
         {
            myThread.Start();
         }
      }

private static void FadeOverlayText()
      {
        OverlayForm.ClearLabelText();
      }

我的表单是一个常规的窗体,有这种方法:

public void ClearLabelText()
      {
         this.Invoke((MethodInvoker)delegate
         {
            StatusText.Text = "Something should happen"
            StatusText.Refresh();
         });

      }

该方法似乎被调用,但没有任何反应。

2 个答案:

答案 0 :(得分:0)

您不应该需要Refresh

这应该有效:

public void ClearLabelText()
{
    if (StatusText.InvokeRequired)
    {
         this.Invoke((MethodInvoker)delegate
         {
            StatusText.Text = "Something should happen";
         });
    }
    else
    {
      StatusText.Text = "Something should happen";
    }
}

你是否真的,你使用了正确的控制,而且在任何其他方面都没有改变字符串,所以它似乎不起作用?请检查每件事。

另外可以肯定的是,你只在第二个帖子中调用ClearLabelText一次,因为ClearLabelText完成后,线程不再存在了。

只要应用程序运行,这将每秒更新一次文本:

private static void FadeOverlayText()
{
    var uiThread = <<Your UI Thread>>;

     while(uiThread.IsAlive)
    {
        OverlayForm.ClearLabelText();

        Thread.Sleep(1000);
    }
}

修改

这是一个我做过的简单例子,它有效。除了StatusText标签之外,我还添加了button1,它也会更改文字。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace ThreadTest2
{
    public partial class Form1 : Form
    {
        Thread mainThread = null;

        public Form1()
        {
            InitializeComponent();

            mainThread = Thread.CurrentThread;

            Thread myThread = new Thread(FadeOverlayText);
            myThread.Start();
        }


        private void FadeOverlayText()
        {

            while (mainThread.IsAlive)
            {
                ClearLabelText();

                Thread.Sleep(1000);
            }
        }

        public void ClearLabelText()
        {
            if (StatusText.InvokeRequired)
            {
                this.Invoke((MethodInvoker)delegate
                {
                    StatusText.Text = "Something should happen";
                });
            }
            else
            {
                StatusText.Text = "Something should happen";
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            StatusText.Text = "It works!";
        }
    }
}

答案 1 :(得分:-1)

使这项工作的一种方法是使用

的计时器
StatusText.Text= yourstring;

每隔n毫秒,让你的线程更新你的字符串&#39;变量到你想要的任何东西。