具有无限循环的文本框中的setText

时间:2013-12-01 03:38:05

标签: c#

我正在实时编写活动识别软件。但我无法在文本框中使用无限循环setText。我尝试搜索谷歌但没有回答。什么时候,我使用“textbox.Text + =”ZZZZ“,它工作,但我使用”textbox.Text =“ZZZ”“,它不工作。我希望有人可以指点我如何解决

private void button1_Click(object sender, EventArgs e)
{
     for (; ; ){
         Thread.Sleep(20);
         ........process....
         tb_activity = "AAA";
     }
 }

2 个答案:

答案 0 :(得分:0)

i can't setText in textbox with infinite loop

除非您在无限循环中使用Thread.Sleep()调试应用程序,否则永远无法确认。

原因:当您使用Thread.Sleep()时,它会使您的主要线程进入睡眠状态,因此使用Thread.Sleep()不是一个好习惯。它会挂起您的UI,因此您无法在UI上看到控件更新,如标签文本更新,TextBox文本更新等。

当然你打电话给Application.DoEvents()刷新用户界面,但由于还有很多其他问题,这不是一个好习惯。

解决方案:我建议您使用Timer而不是使用Thread.Sleep(),因为它在后台运行,因此它不会挂起您的用户界面,您也可以看到更新UI。

简单示例,向您展示如何使用Timer更新文本框上的文本@某些时间间隔

public partial class Form1 : Form
    {
        int count = 0;
        string text1 = "this is a scrolling text";
        System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();               
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            textBox1.ReadOnly = true;
            SetTimer(500);
        }
        private void SetTimer(int milliseconds)
        {            
            timer1.Tick+=new EventHandler(timer1_Tick);
            timer1.Interval = milliseconds;        
            timer1.Start();
        }
        private void timer1_Tick(Object o, EventArgs e)
        {
            if (count < text1.Length)
            {
                textBox1.Text += text1[count];
                count++;
            }
            else
            {
                timer1.Stop();
                button1.Enabled = true;
                textBox1.ReadOnly = false;
            }
        }
    }

答案 1 :(得分:0)

您可以在.Net中使用新的等待异步功能:

private void button1_Click(object sender, EventArgs e)
{
    EndlessTask();
}
async Task EndlessTask()
{
    for(int i = 0; true; i++)
    {
        textBox1.Text = i.ToString();
        await Task.Delay(500);
    }
}

[编辑]注意,如果你想摆脱异步警告:

#pragma warning disable 4014
EndlessTask();
#pragma warning restore 4014