Lorsque j'essaie d'utiliser VistaFolderBrowserDialog dans mon application WPF .NET 4.6.1, l'application se bloque. Si je l'exécute sous le débogueur (en mode Debug ou Release), cela fonctionne très bien.
J'ai essayé de reproduire cela dans l'exemple d'application en modifiant divers appels et en passant au package Nuget, cela fonctionne toujours bien.
J'ai essayé de simplifier la façon dont j'appelais le VistaFolderBrowserDialog et de copier/coller l'exemple de code dans mon application, toujours bloqué.
Avez-vous une idée de pourquoi ou comment traquer le problème ?
Hé @matelich, je ne suis pas en mesure de reproduire le comportement de suspension que vous avez décrit.
Vous trouverez ci - VistaFolderBrowserDialog
aide d' Ookii.Dialogs.Wpf v1.1.0 (_dernier au moment de la rédaction_) et j'ai pu exécuter un :
Debug
construire _sans_ le débogueur attachéDebug
build _with_ le débogueur attachéRelease
construire _sans_ le débogueur attachéRelease
build _with_ le débogueur attachéAucune suspension ou exception ne s'est produite.
Si vous pouvez me fournir un moyen de reproduire le comportement de pendaison, je serais heureux d'approfondir mes recherches.
Le code pertinent dans l'exemple ci-joint :
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");
}
Merci de me répondre rapidement, @augustoproiete. J'ai essayé diverses étapes de reproduction pour explorer les choses. Je vais essayer d'ajouter plus d'utilisation dans mes autres applications WPF pour voir s'il existe un facteur commun qui pourrait identifier pourquoi cela ne fonctionne pas.
J'ai lancé une connexion et reproduit dans mon application, le blocage est à int result = dialog.Show(owner);
dans private bool RunDialog(IntPtr owner)
semble lié :
Je rencontre une lenteur lorsque le chemin sélectionné est un long chemin réseau .
Si j'active Native code debugging
, je vois que le plus de temps est passé quelque part dans cette pile d'appels :
win32u.dll!NtUserMsgWaitForMultipleObjectsEx
() Inconnu
user32.dll!RealMsgWaitForMultipleObjectsEx() Inconnu
shell32.dll!SHProcessMessagesUntilEventsEx() Inconnu
shell32.dll!CChangeRouterProxy::RegisterThread() Inconnu
shell32.dll!SHChangeNotifyRegisterThread
() Inconnu
comdlg32.dll!CFileOpenSave::Show() Inconnu
[Géré vers la transition native]
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(System.IntPtr propriétaire) Ligne 171 C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window propriétaire) Ligne 157 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() Ligne 166 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click (expéditeur d'objet, System.Windows.RoutedEventArgs e) Ligne 56 C#
ou:
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#
ou:
ntdll.dll!RtlpHashStringToAtom() Unknown
ntdll.dll!RtlpFreeAllAtom
() Inconnu
ntdll.dll!RtlpDereferenceAtom() Inconnu
ntdll.dll!RtlDeleteAtomFromAtomTable() Inconnu
kernel32.dll!InternalDeleteAtom
() Inconnu
dui70.dll!DirectUI::Value::_ZeroRelease() Inconnu
dui70.dll!DirectUI::DUIXmlParser::_DestroyTables(void) Inconnu
dui70.dll!DirectUI::DUIXmlParser::~DUIXmlParser() Inconnu
dui70.dll!DirectUI::DUIXmlParser::`vector suppression destructeur'() Inconnu
dui70.dll!DirectUI::AccHDelete
shell32.dll!_DUI_ShellStyleSheet_UninitThreadIfPossible(void) Inconnu
shell32.dll!DUI_ShellStyleSheet_UninitThread(void) Inconnu
shell32.dll!CDUIViewFrame::DestroyFrameWindow(void) Inconnu
shell32.dll!CExplorerBrowser::_CleanupFrame(void) Inconnu
shell32.dll!CExplorerBrowser::Destroy() Inconnu
comdlg32.dll!CFileOpenSave::_OnDestroyDialog() Inconnu
comdlg32.dll!CFileOpenSave::s_OpenSaveDlgProc() Inconnu
user32.dll!UserCallDlgProcCheckWow() Inconnu
user32.dll!DefDlgProcWorker() Inconnu
user32.dll!DefDlgProcW
() Inconnu
user32.dll!UserCallWinProcCheckWow() Inconnu
user32.dll!DispatchClientMessage() Inconnu
user32.dll!__fnDWORD
() Inconnu
ntdll.dll!KiUserCallbackDispatcherContinuer
() Inconnu
win32u.dll!NtUserDestroyWindow
() Inconnu
user32.dll!DialogBox2() Inconnu
user32.dll!InternalDialogBox() Inconnu
user32.dll!DialogBoxIndirectParamAorW
() Inconnu
user32.dll!DialogBoxIndirectParamW
() Inconnu
comdlg32.dll!CFileOpenSave::Show() Inconnu
[Géré vers la transition native]
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(System.IntPtr propriétaire) Ligne 171 C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window propriétaire) Ligne 157 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() Ligne 166 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click (expéditeur d'objet, System.Windows.RoutedEventArgs e) Ligne 56 C#
Commentaire le plus utile
Merci de me répondre rapidement, @augustoproiete. J'ai essayé diverses étapes de reproduction pour explorer les choses. Je vais essayer d'ajouter plus d'utilisation dans mes autres applications WPF pour voir s'il existe un facteur commun qui pourrait identifier pourquoi cela ne fonctionne pas.
J'ai lancé une connexion et reproduit dans mon application, le blocage est à
int result = dialog.Show(owner);
dansprivate bool RunDialog(IntPtr owner)