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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Звершение работы, если есть заблокированный поток 
:(
    Опции темы
Grambler
Дата 4.9.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



если есть поток, который заблокирован то при завершении работы не вызываются ни деструктор класса ни Dispose
приходится вызывать Dispose вручную, в котором уже разблокируется поток,
можно ли как-то сделать это автоматом

вот пример кода
Код

class Program
    {
        static void Main(string[] args)
        {
            TestClass testClass = new TestClass();
            Console.Read();
            testClass.Dispose();
        }
    }

public class TestClass
    {
        public TestClass()
        {
            _worker = new Thread(Work);
            _worker.Start();
        }
        /// <summary>
        /// сигнал для начала потока обработки
        /// </summary>
        protected EventWaitHandle _whWorkGo = new AutoResetEvent(false);
        /// <summary>
        /// сигнал об окончании потока обработки
        /// </summary>
        protected EventWaitHandle _whWorkReady = new AutoResetEvent(false);
        /// <summary>
        /// флаг завершения потоков для выхода из программы
        /// </summary>
        protected bool _isExit;
        /// <summary>
        /// поток
        /// </summary>
        protected Thread _worker;
        /// <summary>
        /// выход из потоков
        /// </summary>
        private void ExitThread()
        {                        
            _isExit = true;
            _whWorkGo.Set();
        }
        /// <summary>
        /// функция потока
        /// </summary>
        private void Work()
        {
            while (true)
            {
                _whWorkReady.Set(); // поток готов к выполнению
                _whWorkGo.WaitOne(); // ожидает прихода задания                
                if (_isExit)
                    break;
                Thread.Sleep(1000);
            }
        }
        #region IDisposable Members
        // Used to determine if Dispose()
        // has already been called.
        private bool disposed = false;
        public void Dispose()
        {
            // Call our helper method.
            // Specifying 'true' signifies that
            // the object user triggered the clean up.
            CleanUp(true);

            // Now suppress finialization.
            GC.SuppressFinalize(this);
        }
        private void CleanUp(bool disposing)
        {
            // Be sure we have not alraedy been disposed!
            if (!this.disposed)
            {
                // If disposing equals true, dispose all
                // managed resources.
                if (disposing)
                {
                    // Dispose managed resources.                                            
                }
                // Clean up unmanaged resources here.                
                ExitThread();                
            }
            disposed = true;
        }
        ~TestClass()
        {
            // Call our helper method.
            // Specifying 'false' signifies that
            // the GC triggered the clean up.
            CleanUp(false);
        }
        #endregion
    }

PM MAIL   Вверх
mihryak
Дата 4.9.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



это поможет
PM MAIL ICQ   Вверх
Grambler
Дата 4.9.2008, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



про фоновые потоки знаю, но как быть если поток не должен завершаться внезапно, а должен корректно завершиться
PM MAIL   Вверх
mihryak
Дата 5.9.2008, 05:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



в таком случае тебе, похоже, придётся держать все созданные и запущенные инстансы классов, содержащих поток
ну и иметь возмножность извне им просигналить об окончании, либо выставить isExit. можно это сделать не напрямую, а через вызов метода вроде Terminate

пс. не пул потоков случайно пишешь? ;)
PM MAIL ICQ   Вверх
Grambler
Дата 9.9.2008, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вобщем-то так и сделано, вызываю для завершения ExitThread()
нет не пул, обычные несколько потоков которые оживают по приходу задания
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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