Информация об изменениях

Сообщение Re[5]: Как вызвать метод формы из родительского потока? от 18.09.2014 9:47

Изменено 18.09.2014 9:48 Danchik

Здравствуйте, mDmitriy, Вы писали:

D>Здравствуйте, Danchik, Вы писали:

D>>>>Вот так:
D>>>а в чем смысл этих строчек?
D>>>
D>>>_thread.Interrupt();
D>>>_thread.Join(Int32.MaxValue); 
D>>>

D>>Interrupt тут мало поможет (недоглядел)
D>>Идея в том чтобы мы таки дождались закрытия потока, а оно произойдет только когда вы закроете форму.
D>>Так как я не знаю сценарий использования вашего Dispose, то предложил такой. Больше конкретики и можна подогнать под ваши потребности.
D>Поток с формой запускается при активизации COM+ объекта и отображает иконку в трее.
D>При удалении COM+ объекта надо бы форму высвободить — по идее, это должно привести к закрытию потока (ибо Application.Run).
D>С чем, собственно, и был связан мой первоначальный вопрос.

Тогда так:

    public class ThreadUIClass1 : IDisposable
    {
        private Form _form;
        private Thread _thread;

        public void Dispose()
        {
            TerminateThread();
        }

        private void TerminateThread()
        {
            if (_thread != null)
            {
                var form = _form;
                if (form != null && form.IsHandleCreated)
                    form.Invoke((MethodInvoker) (() => _form.Close()));
                _thread.Join(Int32.MaxValue);
                _thread = null;
            }
        }

        public void RunThread()
        {
            _thread = new Thread(RunApp);
            _thread.Start();
        }

        private void RunApp(object obj)
        {
            _form = new Form();
            try
            {
                Application.Run(_form);
            }
            finally
            {
                _form.Dispose();
                _form = null;
            }
        }
    }
Re[5]: Как вызвать метод формы из родительского потока?
Здравствуйте, mDmitriy, Вы писали:

D>Здравствуйте, Danchik, Вы писали:

D>>>>Вот так:
D>>>а в чем смысл этих строчек?
D>>>
D>>>_thread.Interrupt();
D>>>_thread.Join(Int32.MaxValue); 
D>>>

D>>Interrupt тут мало поможет (недоглядел)
D>>Идея в том чтобы мы таки дождались закрытия потока, а оно произойдет только когда вы закроете форму.
D>>Так как я не знаю сценарий использования вашего Dispose, то предложил такой. Больше конкретики и можна подогнать под ваши потребности.
D>Поток с формой запускается при активизации COM+ объекта и отображает иконку в трее.
D>При удалении COM+ объекта надо бы форму высвободить — по идее, это должно привести к закрытию потока (ибо Application.Run).
D>С чем, собственно, и был связан мой первоначальный вопрос.

Тогда так:

    public class ThreadUIClass1 : IDisposable
    {
        private Form _form;
        private Thread _thread;

        public void Dispose()
        {
            TerminateThread();
        }

        private void TerminateThread()
        {
            if (_thread != null)
            {
                var form = _form;
                if (form != null && form.IsHandleCreated)
                    form.Invoke((MethodInvoker) (() => form.Close()));
                _thread.Join(Int32.MaxValue);
                _thread = null;
            }
        }

        public void RunThread()
        {
            _thread = new Thread(RunApp);
            _thread.Start();
        }

        private void RunApp(object obj)
        {
            _form = new Form();
            try
            {
                Application.Run(_form);
            }
            finally
            {
                _form.Dispose();
                _form = null;
            }
        }
    }