Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > как грамотно уничтожить поток?


Автор: Demokratizator 17.5.2007, 13:26
Добрый день.

как правильно рпервать поток. например обработчик кнопки "отмена" должен убить поток. как это грамотно сделать, не пользуясь Abort();
Код

//Нажатие кнопки отмена - для закрытия потока
private void _btnCancel_Click(object sender, System.EventArgs e)
{
   if ( null != this._threadGenerateAndShow )
   {
       this._threadGenerateAndShow.Abort () ;
       this._threadGenerateAndShow.Join () ;
   }
}

//Функция потока
private void GenerateReportsAsync ()
{
    try
      {
          ...................................................
      }

    catch (Exception ex)
      {
           if (true == this.IsThreadAbortExceptionExists(ex))
             {
                  // пользователь нажал на кнопку отмена, необходимо немедленно прекратить операции...
                  // не отображаем сообщение об ошибке...
             }
           else
             {
                  Errors.ShowError(ex);
             }
       }
    finally
    {

    }
}

Автор: ivashkanet 17.5.2007, 13:40
Если поток выполняет бесконечный цикл с нетяжелыми операциями внутри, то лучший вариант --- это наличие флага, который прерывает цикл
Код
while(!cancel){}


Если же у нас нет цикла, либо внутри него выполняется долгая операция, то я ничего не могу придумать лучше, чем try/catch и Abort ().
Вот только я бы посоветовал ловить ThreadAbortException вместо вообще всех Exception и флага.

Автор: QryStaL 17.5.2007, 14:08
Thread.Abort() можно считать вполне грамотным способом убить поток. Как вариант, можно использовать класс BackgroundWorker.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)