【问题标题】:C# Break Other Function Loop in Another FunctionC# 在另一个函数中中断其他函数循环
【发布时间】:2013-01-09 01:09:26
【问题描述】:

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

public void btm_Processing_Click(object sender, EventArgs e)
{   
    for (int i = 1; i <= x ; i++)
    {
        // My processing commands are here .
    }
}

这是我的停止按钮事件处理程序。

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)
    {
        // Here is where I want to break that loop.                
    }
    else
    {
        // Do other things.                           
    }
}

我不知道该怎么做。

【问题讨论】:

    标签: c# function for-loop serial-port


    【解决方案1】:

    最好的方法是使用 BackgroundWorker 线程来执行你的循环,然后你可以稍后从主线程中取消它。

    http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

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

    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;
    }
    

    【讨论】:

      【解决方案2】:

      设置中断变量;

      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.
          }
      }
      

      【讨论】:

      • 我必须通过我的停止按钮来处理这个问题,我该如何处理呢?
      • 如果你要使用一个变量,你至少希望它是volatile
      • @JamesMichaelHare 谢谢,我已经根据您的建议更新了示例。
      • 问题是停止程序后,我无法重新运行处理函数!
      • 您可以 - 只需在退出循环后将 shouldStop 设置回 false
      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 2015-08-05
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多