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);にあります。

全てのコメント3件

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

image

image


すぐに返事をくれてありがとう、@ 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._showDialogBu​​tton_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(クラス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)行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._showDialogBu​​tton_Click(object sender、System.Windows.RoutedEventArgs e)Line 56 C#

このページは役に立ちましたか?
0 / 5 - 0 評価