【问题标题】:How to abort a while loop by clicking a button using C#如何通过使用C#单击按钮来中止while循环
【发布时间】:2016-08-06 00:47:42
【问题描述】:

我有一个使用 while 循环显示数字的函数,但我想通过单击按钮使用 c# 以随机变量值停止执行 while 循环。

例如:

private void FrqSent()
{
    int i = 1;
    while (i <= 5)       
    {  
        i = i + 1;
    }  
}

【问题讨论】:

  • 那么最好查看线程,因为您的 while 循环会挂起您的 UI
  • 这个循环是异步运行还是在另一个线程上运行?如果不是,您的按钮不太可能会做很多事情
  • 如果您不熟悉多线程的使用,请使用 BackgroundWorker。将您的功能放入 BackgroundWorker 的 DoWork 事件中,并使用 RunWorkerAsync() 开始执行该功能,并使用 CancelAsync() 停止执行该功能。
  • 你是否在你的 while 循环中做任何与 UI 相关的事情?

标签: c# loops while-loop break


【解决方案1】:

下面是一个关于如何使用 Backgroundworker 完成任务的简单示例:

public partial class Form1 : Form
{
    private int i = 1;

    public Form1()
    {
        InitializeComponent();
    }

    private void FrqSent()
    {           
        while (i <= 500000000)
        {
            if (backgroundWorker1.CancellationPending)
            {
                break;
            }
            else
            {
                i = i + 1;
            }
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        backgroundWorker1.CancelAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        FrqSent();
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        MessageBox.Show(i.ToString());
    }
}

只需创建一个新的 Windows-Forms 项目并添加一个 backgroundworker 对象以及 2 个按钮。您必须手动设置 DoWork、RunWorkerCompleted 和 Click 事件。

编辑:不要忘记将 BackgroundWorker 的 WorkerSupportsCancellation 属性设置为 true。

【讨论】:

    【解决方案2】:

    不是很优雅但很简单

    public partial class Form1 : Form
    {
        private bool _stop;
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void buttonStart_Click(object sender, EventArgs e)
        {
            _stop = false;
            FrqSent();
        }
    
        private void buttonStop_Click(object sender, EventArgs e)
        {
            _stop = true;
        }
    
        private void FrqSent()
        {
            int i = 1;
            while (i <= 5000000 && !_stop)
            {
                i = i + 1;
                Application.DoEvents();
            }
        }
    
    }
    

    【讨论】:

    • Application.DoEvents() 不仅不优雅,而且:如果用户关闭表单而@ 987654323@跑步?
    猜你喜欢
    • 1970-01-01
    • 2021-01-21
    • 2013-08-22
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多