Member 13126702 Ответов: 1

Диалоговое окно пользовательской задачи Wpf, показывающее несколько


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

Мое приложение использует асинхронные задачи (async/await) для загрузки данных из базы данных. Если при загрузке данных возникает ошибка/исключение, поток пользовательского интерфейса покажет (пользовательский) TaskDialog с информацией об ошибках.

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

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

1) Главное окно запускает загрузку данных в нескольких ожидаемых задачах
2) Ожидаемая задача возвращается с ошибкой/исключением
3) диалоговое окно пользовательской задачи отображается с помощью ShowDialog()
4) в то время как диалоговое окно пользовательской задачи все еще отображается, другая ожидаемая задача также возвращается с ошибкой
5) Код продолжения выполняется в потоке пользовательского интерфейса, который является текущим диалогом отображения задачи
6) второго пользовательского диалогового окна задачи отображается в течение первых
и т.д.

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

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

Я знаю, что, должно быть, что-то здесь упускаю, у кого-нибудь есть какие-нибудь идеи на этот счет?

Что я уже пробовал:

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

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

1 Ответов

Рейтинг:
2

Graeme_Grant

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