当我尝试在 WPF .NET 4.6.1 应用程序中使用 VistaFolderBrowserDialog 时,它会挂起该应用程序。 如果我在调试器下运行它(在调试或发布模式下),它运行良好。
我已经尝试通过更改各种调用并切换到 Nuget 包来在示例应用程序中重现这一点,但仍然可以正常工作。
我试图简化我如何调用 VistaFolderBrowserDialog 并将示例代码复制/粘贴到我的应用程序,但仍然挂起。
关于为什么或如何追踪问题的任何想法?
嘿@matelich我无法重现您描述的悬挂行为。
附件是一个使用 .NET 4.6.1 的 WPF 应用程序示例项目,它使用Ookii.Dialogs.Wpf v1.1.0 (撰写本文时_最新_)打开VistaFolderBrowserDialog
,我能够运行:
Debug
构建 _without_ 附带的调试器Debug
build _with_ 附带的调试器Release
构建 _without_ 附带的调试器Release
build _with_ 附带的调试器没有发生挂起或异常。
如果您能为我提供一种重现悬挂行为的方法,我很乐意进一步调查。
附示例中的相关代码:
var dialog = new VistaFolderBrowserDialog
{
Description = "Please select a folder.",
UseDescriptionForTitle = true,
};
if (!VistaFolderBrowserDialog.IsVistaFolderDialogSupported)
{
MessageBox.Show(this,
"You are using an old Windows version. The regular folder browser dialog will open.",
"Sample folder browser dialog");
}
if (dialog.ShowDialog(this).GetValueOrDefault(false))
{
MessageBox.Show(this, "The selected folder was: " + dialog.SelectedPath,
"Sample folder browser dialog");
}
感谢您快速回复我,@augustoproiete。 我确实尝试了各种重现步骤来探索事物。 将尝试在我的其他 WPF 应用程序中添加更多用法,看看是否有一些共同因素可以确定它为什么不起作用。
我投入了一些登录并在我的应用程序中进行了复制,挂起位于private bool RunDialog(IntPtr owner)
int result = dialog.Show(owner);
private bool RunDialog(IntPtr owner)
似乎相关:
当所选路径是长网络路径时,我遇到了速度缓慢的问题。
如果我启用Native code debugging
,我会看到大部分时间都花在了这个调用堆栈的某个地方:
win32u.dll!NtUserMsgWaitForMultipleObjectsEx
() 未知
user32.dll!RealMsgWaitForMultipleObjectsEx() 未知
shell32.dll!SHProcessMessagesUntilEventsEx() 未知
shell32.dll!CChangeRouterProxy::RegisterThread() 未知
shell32.dll!SHChangeNotifyRegisterThread
() 未知
comdlg32.dll!CFileOpenSave::Show() 未知
[管理到本机过渡]
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(System.IntPtr owner) Line 171 C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window owner) Line 157 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() 第 166 行 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click(object sender, System.Windows.RoutedEventArgs e) 第 56 行 C#
或者:
win32u.dll!00007ff9d17c9164() Unknown
user32.dll!00007ff9d2ca059d() Unknown
shell32.dll!SHProcessMessagesUntilEventsEx() Unknown
shell32.dll!CChangeRouterProxy::RegisterThread() Unknown
shell32.dll!SHChangeNotifyRegisterThread() Unknown
comdlg32.dll!CFileOpenSave::Show() Unknown
[Managed to Native Transition]
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(System.IntPtr owner) Line 171 C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window owner) Line 157 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() Line 166 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click(object sender, System.Windows.RoutedEventArgs e) Line 56 C#
或者:
ntdll.dll!RtlpHashStringToAtom() Unknown
ntdll.dll!RtlpFreeAllAtom
() 未知
ntdll.dll!RtlpDereferenceAtom() 未知
ntdll.dll!RtlDeleteAtomFromAtomTable() 未知
kernel32.dll!InternalDeleteAtom
() 未知
dui70.dll!DirectUI::Value::_ZeroRelease() 未知
dui70.dll!DirectUI::DUIXmlParser::_DestroyTables(void) 未知
dui70.dll!DirectUI::DUIXmlParser::~DUIXmlParser() 未知
dui70.dll!DirectUI::DUIXmlParser::`向量删除析构函数'() 未知
dui70.dll!DirectUI::AccHDelete
shell32.dll!_DUI_ShellStyleSheet_UninitThreadIfPossible(void) 未知
shell32.dll!DUI_ShellStyleSheet_UninitThread(void) 未知
shell32.dll!CDUIViewFrame::DestroyFrameWindow(void) 未知
shell32.dll!CExplorerBrowser::_CleanupFrame(void) 未知
shell32.dll!CExplorerBrowser::Destroy() 未知
comdlg32.dll!CFileOpenSave::_OnDestroyDialog() 未知
comdlg32.dll!CFileOpenSave::s_OpenSaveDlgProc() 未知
user32.dll!UserCallDlgProcCheckWow() 未知
user32.dll!DefDlgProcWorker() 未知
user32.dll!DefDlgProcW
() 未知
user32.dll!UserCallWinProcCheckWow() 未知
user32.dll!DispatchClientMessage() 未知
user32.dll!__fnDWORD
() 未知
ntdll.dll!KiUserCallbackDispatcherContinue
() 未知
win32u.dll!NtUserDestroyWindow
() 未知
user32.dll!DialogBox2() 未知
user32.dll!InternalDialogBox() 未知
user32.dll!DialogBoxIndirectParamAorW
() 未知
user32.dll!DialogBoxIndirectParamW
() 未知
comdlg32.dll!CFileOpenSave::Show() 未知
[管理到本机过渡]
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(System.IntPtr owner) Line 171 C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window owner) Line 157 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() 第 166 行 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click(object sender, System.Windows.RoutedEventArgs e) 第 56 行 C#
最有用的评论
感谢您快速回复我,@augustoproiete。 我确实尝试了各种重现步骤来探索事物。 将尝试在我的其他 WPF 应用程序中添加更多用法,看看是否有一些共同因素可以确定它为什么不起作用。
我投入了一些登录并在我的应用程序中进行了复制,挂起位于
private bool RunDialog(IntPtr owner)
int result = dialog.Show(owner);
private bool RunDialog(IntPtr owner)