0

我在 WPF 中创建了自己的自定义任务对话框窗口。我希望它遵循我的应用程序的风格,并且我有一些自定义内容要放置在它上面,所以我不喜欢使用 win32 任务对话框。

我的应用程序使用异步任务(async/await)从数据库加载数据。如果加载数据时出现错误/异常,ui 线程将显示带有错误信息的(自定义)TaskDialog。

win32 任务对话框将显示其自身的一个实例,而其他待显示的 TaskDialogs 仅在第一个返回后才会显示(或者实际上它似乎阻止了等待的任务继续)问题是我的自定义任务对话框显示多个错误同一时间(来自等待的任务),在屏幕上多次显示。

我理解这个问题的方式(也许我在这里错了)是,尽管使用了 ShowDialog(),但我的任务对话框仍在 UI 线程上运行并发送消息。进一步的同步主窗口代码没有执行,但是如果一个任务完成等待,它返回到 UI 线程执行,并假设有一个数据加载错误,另一个(自定义)任务对话框显示:

1) 主窗口开始在多个等待任务中加载数据
2) 等待任务返回错误/异常
3) 自定义任务对话框窗口显示为 ShowDialog()
4) 当自定义任务对话框仍然显示时,另一个等待任务也返回错误
5) 继续代码在当前显示任务对话框的 UI 线程上执行
6) 第二个自定义任务对话框显示在第一个
等之上

我真的无法弄清楚 Win32 任务对话框如何在保持 UI 线程处于活动状态的同时阻止对其自身的多次调用。我尝试了许多不同的解决方案,但似乎没有任何工作正常。

我意识到我可以使我的任务对话框异步,在其上使用信号量和 WaitAsync,但由于我的任务对话框需要返回一个 TaskDialogResult,我需要等待对我的任务对话框的每次调用,这将是太多的代码更改。

我知道我必须在这里遗漏一些东西,有人对此有任何想法吗?

我试过的:

使我的任务对话框调用异步,使用信号量和 WaitAsync 可以工作,但是我的任务对话框需要返回 TaskDialog 结果,所以我必须等待每次调用它,不幸的是,代码更改太多。

我尝试在单独的线程中运行我的任务对话框并阻塞主 UI 线程,直到任务对话框返回。这确实给了我想要的效果,但是阻塞主 UI 线程会导致其他地方出现问题。这似乎也不是正确的方法。

4

0 回答 0