четверг, 15 ноября 2007 г.

Шах и ... пат

На днях пытался устранить предупреждение компилятора по использованию устаревших методов Thread.Suspend и Thread.Resume. Привожу его:

Thread.Suspend has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. ...”

Фрагмент кода, где используются устаревшие методы, выглядит приблизительно так:

//...
thread.Suspend();
try
{
StackTrace stackTrace = new StackTrace(thread, false);
//...
}
finally
{
thread.Resume();
}
//...

В MSDN-документации к конструктору StackTrace(Thread targetThread, bool needFileInfo) сказано, что передаваемый поток должен быть в состоянии Suspended, иначе возникнет ThreadStateException. Небольшой эксперимент подтвердил, что MSDN находится в актуальном состоянии :-). Интересно, что указанный конструктор не помечен как obsolete, и других способов получить трассировку стека (stack trace) для потока в .net 2.0 я не нашел.
Использование предлагаемых “Monitor, Mutex, Event, and Semaphore” приводит к тому, что поток переходит в состояние ThreadState.WaitSleepJoin, что никак не устроило StackTrace. Замечательная статья Managed Thread States из всеми любимого MSDN подтвердила мою догадку, что перевести поток в состояние Suspended можно только путем вызова метода Thread.Suspend. Такой вот трабл :-(.