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

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

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

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

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

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

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

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

Я знаю, что я что-то здесь упускаю, у кого-нибудь есть идеи по этому поводу?

Что я пробовал:

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

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

0 ответов

Другие вопросы по тегам