Impossible d'accéder à un objet supprimé
je suis confronté à un énorme problème avec le "Cannot access a disposed object. Object name: 'TreeView'."
erreur.
Sur un windows les formes de la mienne je l'ai utiliser une personnaliser les fenêtres de l'explorateur d'objets.
Et voici le code de pièces...
Sur le nœud sélectionné cas, je charge les images se trouvant dans le répertoire sélectionné à la FlowLayoutPanel.
Private Sub ExpTree1_ExpTreeNodeSelected(ByVal SelPath As String, ByVal Item As ExplorerControls.CShItem) Handles ExpTree1.ExpTreeNodeSelected
'Loop until all images are loaded.
LoadImagesToFlowPreviewPanel()
End Sub
Sur le bouton fermer de l'événement
Private Sub WizardControl1_CancelClick(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles WizardControl1.CancelClick
Me.Close()
End Sub
Sur le Formulaire de Clôture de l'événement
Private Sub Wizard_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Select Case XtraMessageBox.Show("Exit the application?", Me.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question)
Case Windows.Forms.DialogResult.No
e.Cancel = True
End Select
End If
End Sub
Pendant le débogage, j'ai remarqué que lorsque je confirme la fermeture de l'application, le code du LoadImagesToFlowPreviewPanel
sous continue de s'exécuter. L'erreur est générée lorsque toutes les images sont chargées à la FlowLayoutPanel de contrôle.
Et voici la trace de la pile...
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.TreeView.CreateHandle()
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.TreeView.TvnSelected(NMTREEVIEW* nmtv)
at System.Windows.Forms.TreeView.WmNotify(Message& m)
at System.Windows.Forms.TreeView.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.Control.SendMessage(Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.Control.ReflectMessageInternal(IntPtr hWnd, Message& m)
at System.Windows.Forms.Control.WmNotify(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Application.ParkingWindow.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.TreeView.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.TreeView.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
at CannonUpdater.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 82
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Mise à JOUR: SI toutes les images sont chargées à la FlowLayoutPanel
et la confirmation de la demande de proches qui s'en vient, je n'ai pas d'erreur.
LoadImagesToFlowPreviewPanel()
méthode? Sauf si vous êtes en cours d'exécution que sur un thread séparé, vous ne devriez pas être en mesure de fermer le formulaire, à moins que la méthode est terminée en cours d'exécution. Quel est votre "Boucle jusqu'à ce que toutes les images sont chargées." comment dire? Je ne vois pas en boucle...
OriginalL'auteur GeorgeBoy | 2011-02-10
Vous devez vous connecter pour publier un commentaire.
Vous devriez poster dans les parties pertinentes de votre
LoadImagesToFlowPreviewPanel
méthode.C'est de la spéculation, sans voir le code, mais une explication pourrait être:
LoadImagesToFlowPreviewPanel appelle
Application.DoEvents
dans une boucleLe Formulaire est fermé et le TreeView cédés au cours de l'un des appels à
Application.DoEvents
Mais la boucle continue à exécuter et accède à l'éliminés TreeView.
Si c'était cela, la solution serait soit une refonte afin d'éviter d'appeler
Application.DoEvents
, ou au moins de vérifier si le Formulaire est fermé /TreeView est éliminé après chaque appel àApplication.DoEvents
.Mise à JOUR en réponse au commentaire:
Si vous utilisez
Application.DoEvents
vous vous exposez à la réentrance des problèmes dans votre code, vous devez être très prudent et assurez-vous de comprendre toutes les conséquences lorsque vous l'utilisez. Le problème que vous avez décrit n'est pas le seul problème que vous êtes susceptible de faire face. Je voudrais l'utiliser seulement dans des cas très spécifiques où je peux vous garantir de ne pas avoir de réentrée problèmes (par exemple, tandis qu'un modal boîte de dialogue de progression s'affiche). Et beaucoup de gens vont appelerDoEvents
"mal" et n'ont rien à voir avec ça.Application.DoEvents
au sein d'une boucleJe suis en désaccord que
DoEvents
qui est "mal", mais il est un grave odeur de code. Elle peut conduire à difficile à diagnostiquer des bugs (comme celui-ci), et il indique une mauvaise compréhension de la Windows event-driven modèle. Les seules personnes qui devraient l'utiliser sont ceux qui ont une compréhension approfondie et une appréciation pour ce qu'il est en train de faire, qui sont souvent les mêmes personnes qui, de trouver une meilleure façon de faire leur travail de code. Qui commencent dit, votre réponse est correcte; je ne sais pas pourquoi je suis le seul à upvoted jusqu'à présent et pourquoi il n'a pas été acceptée. Votre psychique débogueur est calibré beaucoup mieux que le mien.Je suis entièrement d'accord avec vous. Comme pour les upvotes, mon expérience est que la réponse à des questions générales attirer plus de celles qui sont spécifiques à ce genre. Mais j'ai plus de points que je ne peux jamais passer donc je ne suis pas concerné 🙂
OriginalL'auteur Joe
Fondamentalement ce qui se passe lorsque vous effectuez une opération sur un objet qui est toujours vivant, que vous avez vendu. Donc, soit comme ceci:
Ou comme ce
Rappelez-vous qu'à l'aide d'un bloc de céder votre objet tout comme manuellement l'appel de la Jeter.
OriginalL'auteur Øyvind Bråthen
Ce qui se passe ici est de commencer un thread qui manipule un objet TreeView et puis avant que le thread est fait, TreeView est éliminé.
Pour corriger cela, vérifiez si le TreeView est disponible à manipuler ou n'est pas disposé à l'aide de TreeView
IsDisposed
bien dans votre fil.OriginalL'auteur decyclone