@zoke

Как в C# осуществить выход из потока (с другого класса)?

В общем, такая суть. Мы имеет поток (Thread), который запускает функцию Start, а она, в свою очередь, работает в цикле и запускает функцию из другого класса - Check. Нам нужно сделать завершение потока из функции Check как можно проще. Потоков у нас будет около 80. Можно сделать возврат значения и останавливать с помощью break, но код будет запутанный, потому что у нас не одна точка выхода должна быть. Посоветуйте оптимальное решение.

class Job
    {
      public void Start ()
      {
           While(true)
           {
               //...иной код
               new Job2().Check();
              //...иной код
           }
      }
    }

И другой класс
class Job2
    {
      public void check ()
      {
           //...иной код
               if(a == true)
               {
                       //здесь должен быть выход из потока.
               }
            //...иной код
           }
      }
    }
  • Вопрос задан
  • 4133 просмотра
Пригласить эксперта
Ответы на вопрос 6
FirstX
@FirstX
.net developer
Мне кажется задача изначально возможно так спроектирована, что получаются запутанные решения. Первая мысль про отмену выполнения потока была тоже сделать на базе CToken, но получается токен нужно передавать еще и в метод check (оттуда же вызываем отмену в данном варианте), что лично мне не не очень нравится.

Вариант с вбросом исключения в принципе должен работать вполне, но сама идея, больше похоже на какой-то хак, в конце концов исключения лучше всего использовать для действительно исключительных ситуаций.

С другой стороны смотрите, получается метод check что-то проверяет. Значит должен возвращать результат проверки (true/ false). По результатам проверки должно приниматься решение о том, прекратить выполнение или продолжить. Мне кажется надо пересмотреть решение задачи, чтобы логика была более очевидной, а не вбросами исключений в разных местах кода.
Ответ написан
Комментировать
AMar4enko
@AMar4enko
Как насчет выбросить исключение, во внешнем цикле его поймать и там выйти?
Ответ написан
Комментировать
newross
@newross
Product owner
А чем не устраивает CancellationToken?
Ответ написан
Комментировать
GrigoryPerepechko
@GrigoryPerepechko
У вас каша в архитектуре. Опишите задачу без ваших догадок касательно реализации и будет намного проще предложить вам более адекватное решение.

Не совсем понимаю зачем вам явное управление потоками. Посмотрите в сторону Task, там для возврата значений и отмены есть удобные механизмы.
Ответ написан
Комментировать
Nirvano
@Nirvano
Можно попробовать вызывать метод Abort у текущего потока.

Thread.CurrentThread.Abort();
Ответ написан
@gleb_kudr
Если есть возможность использовать .net 4.5 то лучше всего делать все с помощью Async конструкций (если использование тредов не оправдано особой необходимостью). Обычный выход с потока передается через Invoke, только придется хранить ссылку на родительский поток.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы