Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Безопасный многопоточный класс 
:(
    Опции темы
Aldegid
Дата 26.8.2012, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 13.6.2011

Репутация: нет
Всего: нет



Пишу класс, который общается с 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 не срубит этот поток никогда.

 Подскажите, как тут сделать грамотно. Как вообще организуется структура в таких случаях?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0396 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.