Ookii-dialogs-wpf: 挂起除非在调试器下运行

创建于 2019-11-25  ·  3评论  ·  资料来源: ookii-dialogs/ookii-dialogs-wpf

当我尝试在 WPF .NET 4.6.1 应用程序中使用 VistaFolderBrowserDialog 时,它会挂起该应用程序。 如果我在调试器下运行它(在调试或发布模式下),它运行良好。

我已经尝试通过更改各种调用并切换到 Nuget 包来在示例应用程序中重现这一点,但仍然可以正常工作。

我试图简化我如何调用 VistaFolderBrowserDialog 并将示例代码复制/粘贴到我的应用程序,但仍然挂起。

关于为什么或如何追踪问题的任何想法?

need-more-info

最有用的评论

感谢您快速回复我,@augustoproiete。 我确实尝试了各种重现步骤来探索事物。 将尝试在我的其他 WPF 应用程序中添加更多用法,看看是否有一些共同因素可以确定它为什么不起作用。

我投入了一些登录并在我的应用程序中进行了复制,挂起位于private bool RunDialog(IntPtr owner) int result = dialog.Show(owner); private bool RunDialog(IntPtr owner)

所有3条评论

@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");
}

image

image


感谢您快速回复我,@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._showDialogBu​​tton_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(类 DirectUI::RefcountBase *)未知
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._showDialogBu​​tton_Click(object sender, System.Windows.RoutedEventArgs e) 第 56 行 C#

此页面是否有帮助?
0 / 5 - 0 等级