Пользовательский интерфейс WPF с длительным зависанием обработки - PullRequest
0 голосов
/ 23 декабря 2011

Я очень извиняюсь за этот длинный пост. Мне нужна помощь по вопросам c # wpf. Я построил сложный пользовательский интерфейс (как-то), и есть некоторые кнопки ... как запуск и остановка и другие.

Когда я нажимаю кнопку «Пуск», процесс запуска начинается с связи с некоторым уровнем протокола и другими, и это длительный процесс ... и во время этого процесса я должен показать некоторый интерфейс уведомления, такой как «Введите текст», «Выбрать что-то "и т.д ... на этот раз мне нужно показать какой-нибудь объект окна wpf ... и через некоторое время мне нужно автоматически уничтожить окно и снова приступить к обработке.

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

Вот моя проблема ... Можете ли вы дать мне какое-то решение, которое ...

  1. у меня будет 2 кнопки .. запустить и остановить
  2. когда я нажимаю кнопку запуска ... запускается большой процесс (например, вложенный цикл for с большим int, который будет продолжаться в течение 50 секунд) в функции с именем Processor.
  3. во время обработки функция Processor создаст несколько окон и покажет их ожидание в течение 5-10 секунд, а также уничтожит их. или пользователь нажимает; s в окне
  4. И все время кнопка «Стоп» должна нажиматься, чтобы при нажатии кнопки «Стоп» процесс был остановлен.

Я пробовал это с backgroundworker, dispatcher ... и используя отдельный поток. но не повезло. Я предполагаю, что что-то упустил. потому что, если я жду некоторого результата, показывающего окно .. окно определенно будет висеть .. и если я разделю их с другим потоком .. это не будет общаться друг с другом. пожалуйста, дайте мне несколько предложений

Ответы [ 2 ]

0 голосов
/ 23 декабря 2011

BackgroundWorker должен делать то, что вам нужно. Установите для WorkerSupportsCancellation и WorkerReportsProgress значение true.

Я бы не советовал открывать несколько окон. Всплывающее окно для отображения статуса. В вашем цикле в DoWork вызовите BackgroundWorker.ReportProgress. Затем в обработчике событий ProgressChanged обновите состояние окна.

Для реализации Stop: В вашем методе DoWork вам нужно проверить свойство CancellationPending на BackgroundWorker в вашем цикле. Когда это правда, вам нужно выйти из этого метода. При нажатии кнопки «Стоп» вызовите BackgroundWorker.CancelAsync ().

0 голосов
/ 23 декабря 2011

Dispatcher определенно является решением. Вам может потребоваться установить Приоритет диспетчера . Совместное использование некоторого соответствующего кода может также выявить некоторые проблемы.

...