• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Проблемы в многопоточности C#

  • Автор темы iamkeeper
  • Дата начала
Статус
Закрыто для дальнейших ответов.
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

это конечно только мое наивное представление о том, что происходит)

в общем, вопрос такой как это можно исправить... ищу наилучший вариант)

Добавлено: пока что в голове следующий вариант:

на нажатие кнопки сгенерировать событие, на которое мы подпишемся в основном потоке и соответственно в основном потоке в обработчике этого события и закроем форму.

но все-таки хотелось бы закрывать форму из потока формы)
 
E

etc

Формам, тобишь окнам, место в основном потоке, а расчеты можно и в доп. поток.
Доп поток считает, и говорит форме, чтоб рисовала чего надо.
 
I

iamkeeper

Прошу прощения, я наверное зря несколько упростил описание задачи)

в общем, система довольно большая и потоков там на самом деле не 2) просто относительно конкретной ситуации получается, что есть основной поток, а есть доп.поток - поток формы) делать наоборот как минимум проблематично, как максимум может оказаться и невозможно без переписывания всей системы... поэтому мне надо искать выход из сложившейся ситуации
 
E

etc

Поиск выхода будет проблематичнее переделки.
 
U

userdab

Возможно вам помогут темы и
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!