C#“VS2012”{WinForm}中while(true)的问题

时间:2015-08-08 17:33:52

标签: c# multithreading winforms loops visual-studio-2012

" int ans = 2;

    private void Form1_Load(object sender, EventArgs e)
    {
        for (int i = 0; i <21; i++)
        {
            ans = 2;
            label1.Text += i.ToString();
            while (true)
            {
                if (ans == 1)
                {
                    break;
                }
            }
        }

    }

    private void button1_Click(object sender, EventArgs e)
    {
        ans = 1;
    } "

这是一个简单的应用

我想打印一个号码&amp;然后等待按钮点击以打破while循环

但是当我运行应用程序时,表单不显示。

“T认为问题是while(true)”。

该怎么办?

4 个答案:

答案 0 :(得分:2)

使用计时器。表单加载时启动计时器。每次滴答时,递增数字并显示它。单击按钮,您只需要停止计时器。

private Timer _myTimer;
private int number = 0;
private void Form1_Load(object sender, EventArgs e)
{
    _myTimer = new Timer();
    _myTimer.Interval = 1; // 1 millisecond
    _myTimer.Tick += new EventHandler(MyTimer_Tick);
    _myTimer.Start();
}

// increments the number at timer tick
private void MyTimer_Tick(object sender, EventArgs e)
{
    number ++;
    // TODO: update UI here
}

// Stops the timer
private void button1_Click(object sender, EventArgs e)
{
    _myTimer.Stop();
} 

答案 1 :(得分:0)

最好不要在这里使用循环。由于此循环不会结束,因此您不会离开Form_Load,也不会显示表单。如果您在用户点击按钮时尝试执行某项任务,为什么不将该逻辑移至button1_Click

答案 2 :(得分:0)

实现您描述的任务的正确方法是:

    private EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.AutoReset);

    private void Form1_Load(object sender, EventArgs e)
    {
        Task.Factory.StartNew(() =>
        {
            for (int i = 0; i < 26; i++)
            {
                ewh.WaitOne();
                Action updateLable = () => label1.Text = "" + i;
                label1.BeginInvoke(updateLable);
            }
        });
    }

    private void button1_Click(object sender, EventArgs e)
    {
        ewh.Set();
    }

正如您所看到的,我已使用.Net busy wait替换了您的wait handle(而(true))。

其中一个答案描述了一个每毫秒行动一次的计时器 - 这是一种忙碌的等待。

答案 3 :(得分:0)

这是 async/await 的用途。使用&#34; async&#34;标记你的Load()事件,然后&#34; await&#34;在Button单击处理程序中触发ManualResetEvent时继续的任务:

    private System.Threading.ManualResetEvent mre = new System.Threading.ManualResetEvent(false);

    private async void Form1_Load(object sender, EventArgs e)
    {
        for (int i = 0; i < 21; i++)
        {
            label1.Text = i.ToString();
            mre.Reset();
            await Task.Factory.StartNew(() => { mre.WaitOne(); });
        }
        button1.Enabled = false;
        label1.Text = "Done!";
    }

    private void button1_Click(object sender, EventArgs e)
    {
        mre.Set();
    }