我正在实时编写活动识别软件。但我无法在文本框中使用无限循环setText。我尝试搜索谷歌但没有回答。什么时候,我使用“textbox.Text + =”ZZZZ“,它工作,但我使用”textbox.Text =“ZZZ”“,它不工作。我希望有人可以指点我如何解决
private void button1_Click(object sender, EventArgs e)
{
for (; ; ){
Thread.Sleep(20);
........process....
tb_activity = "AAA";
}
}
答案 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