Безопасный многопоточный класс

 
0
 
.NET
ava
Aldegid | 26.08.2012, 22:29
Пишу класс, который общается с USB- устройством. У него есть методы, запускающие потоки инициализации, запуска устройства и т.д. На время их выполнения я подумал лучше запереть класс, чтобы не дай бог вдальнейшем эти методы не были вызваны одновременно в нескольких потоках.
    public partial class DeviceCommunicator
{
public void BeginInit( /*...*/ )
{
_initThread = new Thread( Init );
_initThread.Start( /*...*/ );
}

private void Init( Object @params )
{
lock( _commonSyncObject )
{
if( _state != DeviceCommunicatorState.idle )
return;
// возможно долгая операция
_state = DeviceCommunicatorState.ready;
}
}
// то же для Start и других функций
}


Пока все хорошо. Но дальше мне хочется еще прикрутить интерфейс IDisposable.
    public partial class DeviceCommunicator
{
public void Dispose()
{
Dispose( true );
GC.SuppressFinalize( this );
}
protected virtual void Dispose( Boolean disposing )
{
lock( _commonSyncObject ) /* (1) */
{
if( disposing )
{
// в зависимости от состояния устройства
switch( _state )
{
case DeviceCommunicatorState.idle : /* ... */
case DeviceCommunicatorState.initializing :
/* соответствующее удаление, в том числе снятие потока инициализации */
_initThread.Abort();
/* ... */
/* ... */
}
}

}

Ну и как вы понимаете, если писать так, если запирать Dispose способом (1) на тот же самый объект, что и Init и другие внешние методы, то в случае, если такой метод зависнет, Dispose не срубит этот поток никогда.

Подскажите, как тут сделать грамотно. Как вообще организуется структура в таких случаях?
Comments (0)

Comments are not added

Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  Aldegid
advanced
Submit