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

Тема в разделе ".NET", создана пользователем iamkeeper, 16 сен 2010.

Статус темы:
Закрыта.
  1. iamkeeper

    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

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

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

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

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

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

    etc Гость

    Тут проблемма.
     
  3. iamkeeper

    iamkeeper Гость

    а по подробнее можно?
     
  4. etc

    etc Гость

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

    iamkeeper Гость

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

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

    etc Гость

    Поиск выхода будет проблематичнее переделки.
     
Загрузка...
Похожие Темы - Проблемы многопоточности
  1. aliaksandr89
    Ответов:
    3
    Просмотров:
    129
  2. Amfion
    Ответов:
    5
    Просмотров:
    124
  3. wowa
    Ответов:
    7
    Просмотров:
    381
  4. John_Tavarez
    Ответов:
    0
    Просмотров:
    338
  5. Валентин Амбер
    Ответов:
    11
    Просмотров:
    347
Статус темы:
Закрыта.

Поделиться этой страницей