WPF .NET 4.6.1アプリケーションでVistaFolderBrowserDialogを使用しようとすると、アプリケーションがハングします。 デバッガー(デバッグモードまたはリリースモード)で実行すると、うまく機能します。
さまざまな呼び出しを変更し、Nugetパッケージに切り替えることで、サンプルアプリケーションでこれを再現しようとしましたが、それでも正常に機能します。
VistaFolderBrowserDialogの呼び出し方法を簡略化しようとしましたが、サンプルコードをコピーしてアプリケーションに貼り付けましたが、まだハングします。
問題を追跡する理由または方法について何か考えはありますか?
ねえ@matelichあなたが説明したぶら下がり動作を再現できません。
添付されているのは、.NET 4.6.1を使用したWPFアプリのサンプルプロジェクトで、 Ookii.Dialogs.Wpf v1.1.0 (_この記事の執筆時点で最新_)を使用してVistaFolderBrowserDialog
を開き、次のコマンドを実行できました。
Debug
は、デバッガーを接続せずにビルドしますDebug
は、デバッガーが接続された状態でビルドしますRelease
は、デバッガーを接続せずにビルドしますRelease
は、デバッガーが接続された状態でビルドしますハングや例外は発生しませんでした。
ぶら下がっている動作を再現する方法を教えていただければ、さらに調査させていただきます。
添付のサンプルの関連コード:
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);
にあります。
関連しているようです:
選択したパスが長いネットワークパスの場合、速度が低下します。
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)行171 C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window owner)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)Line 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)行171 C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window owner)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)Line 56 C#
最も参考になるコメント
すぐに返事をくれてありがとう、@ augustoproiete。 私は物事を探求するためにさまざまな再現手順を試しました。 他のWPFアプリケーションに使用法を追加して、機能しない理由を特定する可能性のある一般的な要因があるかどうかを確認します。
ログインしてアプリケーションに再現しました。ハングは
private bool RunDialog(IntPtr owner)
int result = dialog.Show(owner);
にあります。