I
iamkeeper
Есть основной поток и есть еще один поток формы.
из основного потока с помощью invoke, очень часто происходит вызов одного из методов этой формы (форма отображает текущий ход выполнения, а метод соответственно обновляет ее).
на форме есть кнопка отмены, по которой сама форма закрывается и все действия тоже прекращаются. Но т.к. обращений к форме очень много, то в 99% случаев после того как форма закрывается, к ней еще пытаются обратиться.
несколько вставленных проверок типа "isHandleCreate не помогают, так как и их тоже успеваем проскочить.
вот код:
Основной поток
<!--shcode--><pre><code class='C#'>//f_индикатор - переменная формы
if (f_индикатор != null && f_индикатор.IsHandleCreated)
lock (f_синхронизацияИндикатора)
{
f_индикатор.Invoke(new ThreadStart(
delegate
{
if (f_индикатор != null)
f_индикатор.УстановитьСостояние(e);
}
));
}[/CODE]
поток формы (здесь в общем-то ничего интересного)
<!--shcode--><pre><code class='C#'>private void btnОтмена_Click(object sender, EventArgs e)
{
...//небольшая предварительная обработка
Close();
}[/CODE]
<!--shcode--><pre><code class='C#'>public void УстановитьСостояние(ВыполнениеОтчетаEventArgs e)
{
if (!IsHandleCreated)
return;
...//установка необходимых значений
}[/CODE]
насколько я понял, как все работает примерно по следующему сценарию:
в момент нажатия на кнопку Отмена, в основном потоке выполняются какие-то свои действия, пока в процедуре btnОтмена_Click выполняется предварительная проверка перед непосредственно закрытием, основной поток формы успевает добежать до invoke, а пока invoke разбирается надо ему в другой поток соваться или не надо (т.е. перед тем как непосредственно сделать вызов метода в другом потоке invoke все равно делает свои предварительные действия) дак вот, за это время форма уже успевает закрыться а потом идет вызов метода уже закрытой формы и вылетает exception
это конечно только мое наивное представление о том, что происходит)
в общем, вопрос такой как это можно исправить... ищу наилучший вариант)
Добавлено: пока что в голове следующий вариант:
на нажатие кнопки сгенерировать событие, на которое мы подпишемся в основном потоке и соответственно в основном потоке в обработчике этого события и закроем форму.
но все-таки хотелось бы закрывать форму из потока формы)
из основного потока с помощью invoke, очень часто происходит вызов одного из методов этой формы (форма отображает текущий ход выполнения, а метод соответственно обновляет ее).
на форме есть кнопка отмены, по которой сама форма закрывается и все действия тоже прекращаются. Но т.к. обращений к форме очень много, то в 99% случаев после того как форма закрывается, к ней еще пытаются обратиться.
несколько вставленных проверок типа "isHandleCreate не помогают, так как и их тоже успеваем проскочить.
вот код:
Основной поток
<!--shcode--><pre><code class='C#'>//f_индикатор - переменная формы
if (f_индикатор != null && f_индикатор.IsHandleCreated)
lock (f_синхронизацияИндикатора)
{
f_индикатор.Invoke(new ThreadStart(
delegate
{
if (f_индикатор != null)
f_индикатор.УстановитьСостояние(e);
}
));
}[/CODE]
поток формы (здесь в общем-то ничего интересного)
<!--shcode--><pre><code class='C#'>private void btnОтмена_Click(object sender, EventArgs e)
{
...//небольшая предварительная обработка
Close();
}[/CODE]
<!--shcode--><pre><code class='C#'>public void УстановитьСостояние(ВыполнениеОтчетаEventArgs e)
{
if (!IsHandleCreated)
return;
...//установка необходимых значений
}[/CODE]
насколько я понял, как все работает примерно по следующему сценарию:
в момент нажатия на кнопку Отмена, в основном потоке выполняются какие-то свои действия, пока в процедуре btnОтмена_Click выполняется предварительная проверка перед непосредственно закрытием, основной поток формы успевает добежать до invoke, а пока invoke разбирается надо ему в другой поток соваться или не надо (т.е. перед тем как непосредственно сделать вызов метода в другом потоке invoke все равно делает свои предварительные действия) дак вот, за это время форма уже успевает закрыться а потом идет вызов метода уже закрытой формы и вылетает exception
это конечно только мое наивное представление о том, что происходит)
в общем, вопрос такой как это можно исправить... ищу наилучший вариант)
Добавлено: пока что в голове следующий вариант:
на нажатие кнопки сгенерировать событие, на которое мы подпишемся в основном потоке и соответственно в основном потоке в обработчике этого события и закроем форму.
но все-таки хотелось бы закрывать форму из потока формы)