如何运行while循环?

时间:2015-07-19 11:39:42

标签: c# visual-studio

我想创建一个表单应用程序,每隔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);
    }
}

但是当我运行该程序时,它只是冻结了 (我在控制台应用程序中编写了几乎所有的程序并且运行顺利)。

3 个答案:

答案 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);
             }
        });
    }