如何使用按钮停止长循环运行

本文关键字:循环 运行 何使用 按钮 | 更新日期: 2023-09-27 17:59:10

我有一个c#应用程序,它有两个按钮。第一个循环是运行10k次。并且每个循环代码执行需要1秒才能完成。

    for(int i=0;i<10000;i++){
      //My running code take 1 sec for each loop
    }

有时我想在点击另一个按钮"停止"时停止这个循环/执行,但它不起作用。请给我建议什么解决方案。

如何使用按钮停止长循环运行

UI Thread(处理所有UI事件的线程,如按钮单击)中运行长时间运行的操作不是一种好的做法。你应该在另一个循环中运行。

您可以使用Task Parallel Library (TPL):

    private bool stopIt = false;
    private void Form1_Load(object sender, EventArgs e)
    {
        Task task = Task.Factory.StartNew(() =>
            {
                for (int i = 0; i < 1000000000; i++)
                {
                    if (!stopIt)
                    {
                        Console.WriteLine("Here is " + i);
                    }
                    else
                    {
                        break;
                    }
                }
            });
    }
    private void button1_Click(object sender, EventArgs e)
    {
        stopIt = true;
    }

最简单的解决方案(不是最好的)是将Application.DoEvents()添加到循环中以处理按钮事件:

private bool cancel;
public void loop()
{
    for(int i=0;i<10000;i++){
      //My running code take 1 sec for each loop
       Application.DoEvents();
       if (cancel)
          break;
    }
}
public void cancelButton_Click(object sender, EventArgs e)
{
      cancel=true;
}

更好且更简单的解决方案是使用异步Task(代码的其余部分保持不变,减去Application.DoEvents()调用):

private void loopButton_Click(object sender, EventArgs e)
{
    new Task(loop).Start();
}

注意,在这种情况下,应该使用this.Invoke(new Action(() => { <your code> } ));从循环中访问UI控件。