Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Звершение работы, если есть заблокированный поток


Автор: Grambler 4.9.2008, 09:26
если есть поток, который заблокирован то при завершении работы не вызываются ни деструктор класса ни 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
    }

Автор: mihryak 4.9.2008, 11:29
http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx поможет

Автор: Grambler 4.9.2008, 23:42
про фоновые потоки знаю, но как быть если поток не должен завершаться внезапно, а должен корректно завершиться

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

пс. не пул потоков случайно пишешь? ;)

Автор: Grambler 9.9.2008, 12:25
вобщем-то так и сделано, вызываю для завершения ExitThread()
нет не пул, обычные несколько потоков которые оживают по приходу задания

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)