Есть кнопка которая при нажатии запускает действие, и при повторном нажатии останавливает
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. Почему так? Как это исправить?
Пожалуй, вынесу комментарий 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;
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
я получаю из базы данных строку следующего типа 1,2,3,4,5 Мне нужно заполнить массив int этими значениями и посчитать их кол-во (в данном случае...
прочитав несколько статей я понял что например когда данные тащим из бд то лучше использовать IEnumerable а в других случаях IList
Из ToggleGroup мне нужно получить все элементы, но не в виде Toggle а в виде GameObjectКакие варианты решения есть для этой задачи?