Можно ли создать безопасный многопоточный класс - C#

Узнай цену своей работы

Формулировка задачи:

Всем еще раз привет. Пишу класс, который общается с 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 не срубит этот поток никогда. Подскажите, как тут сделать грамотно. Как вообще организуется структура в таких случаях?

Решение задачи: «Можно ли создать безопасный многопоточный класс»

textual
Листинг программы
                    if( _state != DeviceCommunicatorState.idle )
                        return;
                // возможно долгая операция            
                    _state = DeviceCommunicatorState.ready;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы