我在WPF中创建了自己的自定义任务对话框窗口。我希望它遵循我的应用程序的样式,并且我有一些自定义内容,所以我不想使用win32任务对话框。
我的应用程序使用异步任务(async / await)从数据库加载数据。如果在加载数据时出现错误/异常,则ui线程将显示带有错误信息的(自定义)TaskDialog。
win32任务对话框将显示其自身的一个实例,并且要显示的其他待处理TaskDialogs将仅在第一个返回后显示(或实际上它似乎阻止等待的任务延续)问题是我的自定义任务对话框正在显示多个错误同时(来自等待的任务),在屏幕上多次出现。
我理解这个问题的方式(也许我在这里错了)是尽管使用了ShowDialog(),但我的任务对话框正在UI线程上运行并且正在传递消息。进一步的同步主窗口代码没有执行,但是如果任务完成等待,它返回到要执行的UI线程,并假设存在数据加载错误,则显示另一个(自定义)任务对话框:
1)主窗口在多个等待的任务中开始数据加载
2)等待任务返回错误/异常
3)自定义任务对话窗口显示为ShowDialog()
4)当自定义任务对话框仍然显示时,另一个等待的任务也返回错误
5)继续代码在当前显示任务对话框的UI线程上执行
6)在第一个上方显示第二个自定义任务对话框
等
我真的无法弄清楚Win32 taskdialog如何在保持UI线程活动的同时阻止多次调用自身。我尝试了很多不同的解决方案,似乎没有什么工作正常。
我意识到我可以让我的任务对话异步,在它上面使用信号量和WaitAsync,但由于我的任务对话框需要返回一个TaskDialogResult,我需要等待每次调用我的任务对话框,这会太多了代码更改。
我知道我必须在这里遗漏一些东西,有人对此有任何想法吗?
我尝试过:
使我的任务对话框调用异步,使用信号量和WaitAsync就可以了,但我的任务对话框需要返回一个TaskDialog结果,因此我必须等待每次调用它,不幸的是代码更改太多了。
我尝试在单独的线程中运行我的任务对话框并阻止主UI线程,直到任务对话框返回。这确实给了我预期的效果,但阻止主UI线程导致其他地方的问题。这似乎也不是正确的方法。