1. Мегаконкурс в апреле "Приведи друзей на codeby". Дарим деньги, подписку на журнал хакер и выдаем статус "Paid Access". Подробнее ...

    Скрыть объявление

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

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

Наш партнер Genesis Hackspace
Статус темы:
Закрыта.
  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. nikos
    Ответов:
    29
    Просмотров:
    340
  2. lmike
    Ответов:
    18
    Просмотров:
    253
  3. VikTor1990
    Ответов:
    0
    Просмотров:
    70
  4. hitesh
    Ответов:
    6
    Просмотров:
    155
  5. Hackerelite
    Ответов:
    24
    Просмотров:
    561
Статус темы:
Закрыта.

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