Существует ли какое-либо событие, например Thread.OnAborting ()? - PullRequest
1 голос
/ 20 июля 2011

Среда:

Допустим, у меня есть основное приложение, которое:

  • Прослушивает запросы на выполнение задач,
  • Выполнениеэти задачи (которые используют некоторые ресурсы (в физическом смысле)) одна за другой,
  • Должна быть в состоянии мгновенно остановить ожидающую задачу для утилизации ресурсов.

У меня есть два таймера:

  • На тике timer1 приложение получает новые запросы и сохраняет их в Queue,
  • На timer2отметьте, что приложение отменяет запрос на выполнение задачи в новом Thread.

Когда пользователь просит остановить все задачи, чтобы освободить ресурсы, я планирую просто прекратить выполнение потокатекущее задание с Thread.Abort().

Проблема:

Я хотел бы иметь возможность сохранить последнюю конфигурацию при удалении потока изкласс потока.

Вопрос:

Есть ли способ определить, когда поток уничтожаетсяed, как событие Thread.OnAborting()?

Или, может быть, я мог бы поймать ThreadAbortException, вызванное при вызове метода Thread.Abort()?(если так, я действительно не знаю, как это сделать, не могли бы вы привести пример кода?)

Ответы [ 3 ]

5 голосов
/ 20 июля 2011

Кроме перехвата ThreadAbortException другого механизма не существует. Конечно, вы действительно не хотите звонить по номеру Thread.Abort, потому что ThreadAbortException вводится асинхронно, и эти точки могут быть непредсказуемыми. Например, это может быть в середине записи, что может привести к тому, что весь AppDomain будет поврежден. .NET 2.0 добавил ограниченные области выполнения , что делает работу с прерываниями потока намного безопаснее и проще в обращении, но все еще невероятно трудно создать блок кода, который может гарантировать, что AppDomain не будет поврежден. Мой совет - использовать идею Thread.Abort.

Вместо этого вы хотите послать сигнал потоку и позволить ему завершить его самостоятельно. Это можно сделать с помощью следующих механизмов.

  • Опрос флага
  • Использовать ручки ожидания
  • Звоните Thread.Interrupt
  • Использовать механизмы отмены, встроенные в API длительных операций

Вы можете увидеть мой ответ здесь для получения дополнительной информации.

1 голос
/ 20 июля 2011

Лейто, это, вероятно, будет лучший способ создать задачи, которые можно прервать, просто установив флаг или выполнив событие или сигнал.К сожалению, вы предоставили мне меньше информации, чтобы предоставить вам точный фрагмент кода, но возможное, очень простое, решение могло бы быть:

class MyTask
{
    bool bShouldDoWork;

    public event EventHandler Aborted;

    public void DoWork()
    {    
         bShouldDoWork = true;          

         while(bShouldDoWork)
         {
              //Do work.
              //But ensure that the loop condition is checked often enough to
              //allow a quick and graceful termination. 
         }

         if(Aborted != null)
         {
              //Fire event
              Aborted(this, EventArgs.Empty);
         }
    }

    //Call this method from another thread, for example
    //when a button is pressed in your UI etc.
    public void Abort()
    {
         bShouldDoWork = false;
    }
}

Обратите внимание, что этот фрагмент является очень простым и можеттребуют модификации, чтобы соответствовать вашим потребностям.Я надеюсь, что это поможет вам поймать идею правильной многопоточности.

Пожалуйста, не используйте Thread.Abort ().Это только даст вам много головной боли.

1 голос
/ 20 июля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...