Как остановить цикл? C#

87
17 мая 2021, 05:20

Есть кнопка которая при нажатии запускает действие, и при повторном нажатии останавливает

private void Button_Click(object sender, EventArgs e)
    {
        var DoWork = new Work();
        if (Button.Text == "Начать")
        {
            Button.Text = "Стоп";
            DoWork.SomeWork();
        }
        else
        {
            followButton.Text = "Начать";
            DoWork.Stop(true);
        }
    }

Есть метод который выполняет работу в цикле и при повторном нажатии нужно его остановить:

class Work
{
    private bool _stopWork = false;
    public void Stop(bool stopWork)
    {
        _stopWork = stopWork;
    }
    public void SomeWork()
    {
       Цикл
       if (_stopWork)
           break;
    }
}

Но это не работает, в режиме дебага смотрел, при нажатии кнопки выполняется метод public void Stop(bool stopWork), но в методе SomeWork() _stopWork все ровно ровняется false. Почему так? Как это исправить?

Answer 1

Пожалуй, вынесу комментарий vitidev в ответ. У Вас действительно при каждом клике создаётся новый объект класса Work. И работа запускается или останавливается каждый раз в другом экземпляре класса. Чтобы этого избежать, необходимо объявление var DoWork = new Work(); вынести за пределы обработчиков нажатий и сделать DoWork, например, свойством класса. Тогда каждый раз обращение будет идти к одному и тому же объекту.

И ещё добавление по правильности ООП лично от меня: не стоит передавать в метод Stop() булев аргумент. Название метода чётко говорит о том, что он должен остановить работу. Однако, если передать в него false, метод перестанет выполнять своё предназначение, что не есть хорошо.

Принимая во внимание оба замечания, ваш код можно переписать так:

private Work DoWork = new Work(); // Инициализация таким образом не является хорошей идеей и стоит здесь только для примера. По-хорошему инициализировать свойство следует в конструкторе.
private void Button_Click(object sender, EventArgs e)
    {
        if (Button.Text == "Начать")
        {
            Button.Text = "Стоп";
            DoWork.SomeWork();
        }
        else
        {
            followButton.Text = "Начать";
            DoWork.Stop();
        }
    }

Класс будет выглядеть так:

class Work
{
    private bool _stopWork = false;
    public void Stop()
    {
        _stopWork = true;
    }
    public void SomeWork()
    {
       _stopWork = false; // Чтобы можно было начать цикл при новом клике
       Цикл
       if (_stopWork)
           break;
    }
}
READ ALSO
Заполнить массив значениями из базы данных и получить их кол-во

Заполнить массив значениями из базы данных и получить их кол-во

я получаю из базы данных строку следующего типа 1,2,3,4,5 Мне нужно заполнить массив int этими значениями и посчитать их кол-во (в данном случае...

81
IEnumerable или IList что лучше всего использовать?

IEnumerable или IList что лучше всего использовать?

прочитав несколько статей я понял что например когда данные тащим из бд то лучше использовать IEnumerable а в других случаях IList

115
Все элементы из ToggleGroup в виде GameObject

Все элементы из ToggleGroup в виде GameObject

Из ToggleGroup мне нужно получить все элементы, но не в виде Toggle а в виде GameObjectКакие варианты решения есть для этой задачи?

95
CA1707 vs IDE0060

CA1707 vs IDE0060

Предупреждение CA1707 говорит:

126