C#在另一个函数中中断另一个函数循环

C#在另一个函数中中断另一个函数循环,c#,function,for-loop,serial-port,C#,Function,For Loop,Serial Port,我有两个函数-一个是在循环中的串行端口上运行一些命令,另一个是事件处理程序,它应该在第一个方法中停止循环的执行。下面是一些示例代码 public void btm_Processing_Click(object sender, EventArgs e) { for (int i = 1; i <= x ; i++) { // My processing commands are here . } } 我不知道如何才能做到这一点。设置一个中断变

我有两个函数-一个是在循环中的串行端口上运行一些命令,另一个是事件处理程序,它应该在第一个方法中停止循环的执行。下面是一些示例代码

public void btm_Processing_Click(object sender, EventArgs e)
{   
    for (int i = 1; i <= x ; i++)
    {
        // My processing commands are here .
    }
}
我不知道如何才能做到这一点。

设置一个中断变量

private volatile bool shouldStop = false;

private void btm_Processing_Click(object sender, EventArgs e)
{          
    for (int i = 1; i <= x ; i++)
    {
        //My Processing Commands are Here 

        if (shouldStop)
        {
            shouldStop=false;
            break;
        }
    }
}

private void btm_Stop_Click(object sender, EventArgs e)
{
    var dialogResult = MessageBox.Show("Do you want to stop processing?",
                                       "Error",
                                       MessageBoxButtons.YesNo);

    if (dialogResult == DialogResult.Yes)
    {
        shouldStop = true;                
    }
    else
    {    
        // Do other things.
    }
}
private volatile bool shouldStop=false;
私有无效btm\u处理\u单击(对象发送者,事件参数e)
{          

对于(inti=1;i来说,最好的方法是使用BackgroundWorker线程来执行循环,然后您可以稍后从主线程取消它

更简单的方法是创建一个您设置的全局变量

private volatile bool isWorking = false;
public void btm_Processing_Click(object sender, EventArgs e)
{
    isWorking = true;
    for (int i = 1; i <= x ; i++)
    {
        //My Processing Commands are Here 
        if(!isWorking)
            break;
    }
}

private void btm_Stop_Click(object sender, EventArgs e)
{
    DialogResult dialogResult = MessageBox.Show("Do You Want To Stop Processing ? ", "Error", MessageBoxButtons.YesNo);
    isWorking = dialogResult != DialogResult.Yes;
}
private volatile bool isWorking=false;
公共无效btm\u处理\u单击(对象发送者,事件参数e)
{
isWorking=true;

对于(int i=1;我必须通过我的停止按钮来处理这个问题。我如何在那里处理它?如果你要使用一个变量,你至少希望它是
易变的
@JamesMichaelHare谢谢,我已经用你的建议更新了这个示例。问题是在停止程序后,我无法重新运行处理函数!你可以-只需设置
shouldSt退出循环后,op
返回到
false
private volatile bool isWorking = false;
public void btm_Processing_Click(object sender, EventArgs e)
{
    isWorking = true;
    for (int i = 1; i <= x ; i++)
    {
        //My Processing Commands are Here 
        if(!isWorking)
            break;
    }
}

private void btm_Stop_Click(object sender, EventArgs e)
{
    DialogResult dialogResult = MessageBox.Show("Do You Want To Stop Processing ? ", "Error", MessageBoxButtons.YesNo);
    isWorking = dialogResult != DialogResult.Yes;
}