Диалог останавливает выполнение кода, есть ли способ остановить его в c #? - PullRequest
0 голосов
/ 21 октября 2010

Я отображаю диалоговое окно в главной форме, теперь один цикл for работает позади, но когда появится это диалоговое окно, выполнение кода будет остановлено, но я не хочу позволять останавливать выполнение кода, есть ли какие-либо другие способ сделать это?

РЕДАКТИРОВАТЬ: я использую поток сейчас, чтобы сделать это, и мой код похож на

    Thread t;
    private void StartParsingByLoop()
    {
       t = new Thread(new ThreadStart(RunProgress));
       t.Start();
       for (int i = 0; i < dialog.FileNames.Length; i++)
       {
          cNoteToParsed.AllContrctNotesFilePath.Add(dialog.FileNames[i].ToString());
       }
          cNoteToParsed.ParseContractNote();
          if (cNoteToParsed.NOfContrctNoteParsed > 0)
                LoadTransactionsInDataGridView();
          t.Abort();
    }

    private void RunProgress()
    {
        frmProgress progressForImportingTran = new frmProgress("Importing Transactions", "ok");
        progressForImportingTran.ShowDialog();
    }

Теперь у меня проблема в том, что диалоговое окно, отображающее ход выполнения, не ведет себя как диалоговое окно и предоставляет доступ к основной форме, а если мы пытаемся получить доступ к основной форме, то диалог скрывается. И я не хочу, чтобы диалог был скрыт.

Ответы [ 4 ]

1 голос
/ 21 октября 2010

(этот ответ основан на предположении, что мы рассматриваем приложение winforms)

Показать форму, используя метод Show, а не ShowDialog.Передав ссылку на основную форму, диалоговое окно останется поверх главной формы, даже если оно не является модальным:

TheDialog dialog = new TheDialog();
dialog.Show(this);

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

В своем вопросе вы заявляете, что существуют требования, которые не позволяют использовать для этого многопоточность.Такое требование кажется мне странным, и очень жаль, потому что это один из типичных сценариев, когда вы хотите использовать какую-то асинхронную конструкцию.Выполняя тяжелую работу над потоком пользовательского интерфейса, вы получаете некоторые недостатки, в том числе:

  • Пользовательский интерфейс не будет реагировать - если вы хотите разрешить пользователю отменять работу с помощьющелкнув по кнопке, сложно добиться надежным способом.
  • Пользовательский интерфейс не будет правильно перерисовываться , поскольку поток пользовательского интерфейса занят выполнением другой работы.
1 голос
/ 21 октября 2010

Вы можете позволить другому потоку обрабатывать цикл.

Ответ на редактирование: Можете ли вы предоставить более подробную информацию, возможно, некоторый код?что делает цикл?какую форму вы отображаете?

0 голосов
/ 21 октября 2010

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

Модальное диалоговое окно не означает, что выполнение остановлено - это просто происходит в другом месте.

Есть несколько способов сделать это, и вы исключили создание нового потока (не знаю почему, это решило бы это элегантно). Если не использовать поток, у вас будет другая проблема - ваша обработка должна выполняться в чанках, и каждый раз вам придется делать что-то вроде Application.DoEvents(), чтобы ваше приложение могло обрабатывать сообщения и не зависать для пользователя. .

Итак, если вы можете создать метод в основной форме, который отображает диалоговое окно «Пожалуйста, подождите», которое выполнит некоторую работу, а затем сделает еще несколько, пока не закончится, вы можете сделать это:

  • создать новую форму (диалоговое окно ожидания)
  • запустить таймер внутри него и подключить таймер к форме РОДИТЕЛЯ
  • интервал таймера должен быть 1
  • ShowDialog() форма
  • при событии таймера выполняйте небольшой объем работы (не позволяйте, чтобы оно продолжалось более 1/10 секунды)

Вы можете сделать это?

В любом случае:

  • задача не может быть разбита на маленькие работоспособные части
  • вы не можете использовать темы
  • вы хотите, чтобы ваш пользовательский интерфейс реагировал

PICK 2. Вы не можете иметь все 3 в Winforms.

0 голосов
/ 21 октября 2010

Не используйте ShowDialog(), но Show() для отображения диалоговых окон.Show() немедленно вернется к вызывающей стороне, тогда как ShowDialog() задержит выполнение.Обратите внимание, что при использовании Show() ваши диалоги больше не будут модальными.

...