我想创建一个表单应用程序,每隔0.1秒更新textBox
中的文本
所以我这样做了:
private void Start_Stop_Click(object sender, EventArgs e)
{
double x;
while (true)
{
x = x + 0.00522222222222222222222222222222;
y.Text = x.ToString();
Thread.Sleep(100);
}
}
但是当我运行该程序时,它只是冻结了 (我在控制台应用程序中编写了几乎所有的程序并且运行顺利)。
答案 0 :(得分:5)
像这样使用Timer
:
double x = 0;
Timer timer1 = new Timer();
public Form1()
{
InitializeComponent();
timer1.Interval = 100;
timer1.Tick += new EventHandler(timer1_Tick);
}
private void Start_Stop_Click(object sender, EventArgs e)
{
if (timer1.Enabled)
{
timer1.Stop();
}
else
{
timer1.Start();
}
}
private void timer1_Tick(object sender, EventArgs e)
{
x = x + 0.00522222222222222222222222222222;
textBox1.Text = x.ToString();
}
答案 1 :(得分:3)
虽然没有多大意义,但您可以使用Task.Delay
实现您想要的效果。它将异步控制回UI消息循环(内部,它使用一个计时器):
private bool shouldIterate;
private async void StartStopClick(object sender, EventArgs e)
{
if (shouldIterate)
{
shouldIterate = false;
return;
}
shouldIterate = true;
while (shouldIterate)
{
x = x + 0.00522222222222222222222222222222;
y.Text = x.ToString();
await Task.Delay(100);
}
}
虽然我建议你把间隔设置得更合理。
答案 2 :(得分:0)
您还可以运行单独的任务,向其传递同步上下文。使用volatile关键字确保可以从不同线程以线程安全的方式使用isCanceled字段。您可以将其用作“' while”的条件。循环(开始/停止你的任务)。
volatile bool isCanceled = true;
private void Start_Stop_Click(object sender, EventArgs e)
{
isCanceled = !isCanceled;
if(isCanceled) return;
// gets context of current UI thread (to update smth later using it)
SynchronizationContext cont = SynchronizationContext.Current;
// starts hot task with your logic
Task.Factory.StartNew(() =>
{
double x = 0;
while (!isCanceled )
{
x = x + 0.05;
// this operation will be executed on UI thread with use of sync context
cont.Post(delegate { y.Text = x.ToString(); }, null);
Thread.Sleep(100);
}
});
}