Когда я пытаюсь использовать VistaFolderBrowserDialog в своем приложении WPF .NET 4.6.1, приложение зависает. Если я запускаю его под отладчиком (в режиме отладки или выпуска), он отлично работает.
Я попытался воспроизвести это в примере приложения, изменив различные вызовы и переключившись на пакет Nuget, все еще работает нормально.
Я попытался упростить то, как я вызываю VistaFolderBrowserDialog и копирую / вставляю образец кода в свое приложение, но все еще зависает.
Есть мысли относительно того, почему и как отследить проблему?
Привет, @matelich, я не могу воспроизвести описанное вами поведение зависания.
Прилагается пример проекта приложения WPF с использованием .NET 4.6.1, который открывает VistaFolderBrowserDialog
с помощью Ookii.Dialogs.Wpf v1.1.0 (_latest на момент написания_), и мне удалось запустить:
Debug
build _без подключенного отладчикаDebug
build _с_ присоединенным отладчикомRelease
build _без подключенного отладчикаRelease
build _с_ присоединенным отладчикомНикаких зависаний или исключений не произошло.
Если вы можете предоставить мне способ воспроизвести поведение зависания, я буду рад продолжить исследование.
Соответствующий код в прилагаемом образце:
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, чтобы увидеть, есть ли какой-то общий фактор, который может определить, почему он не работает.
Я бросил вход в систему и воспроизвел в своем приложении, зависание находится на 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) Строка 171 C #
Ookii.Dialogs.Wpf.dll! Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog (владелец System.Windows.Window) Строка 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 (отправитель объекта, 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) Строка 171 C #
Ookii.Dialogs.Wpf.dll! Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog (владелец System.Windows.Window) Строка 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 (отправитель объекта, System.Windows.RoutedEventArgs e) Строка 56 C #
Самый полезный комментарий
Спасибо, что быстро связались со мной, @augustoproiete. Я пробовал различные шаги воспроизведения, чтобы исследовать вещи. Собираюсь попытаться добавить больше использования в другие мои приложения WPF, чтобы увидеть, есть ли какой-то общий фактор, который может определить, почему он не работает.
Я бросил вход в систему и воспроизвел в своем приложении, зависание находится на
int result = dialog.Show(owner);
вprivate bool RunDialog(IntPtr owner)