Appeler ou BeginInvoke ne peut pas être appelée sur un contrôle jusqu'à ce que la poignée de la fenêtre a été créé
- Je obtenir de l'exception suivante jeté:
Appeler ou BeginInvoke ne peut pas être appelée sur un contrôle jusqu'à ce que la poignée de la fenêtre a été créé.
C'est mon code:
if (InvokeRequired)
{
BeginInvoke(new UpdateTextFieldDelegate(WriteToForm), finished, numCount);
}
else
Invoke(new UpdateTextFieldDelegate(WriteToForm), finished, numCount);
J'ai trouvé des pages sur ce sujet sur ce site mais je ne sais pas ce qui est mal.
Sans en savoir plus sur le problème, il semble que vous êtes en invoquant un événement avant que le formulaire est entièrement créé/initialisé, ou sur un autre thread à un certain point où il ne devrait pas l'être.
Si vous avez tous les compteurs en cours d'exécution (Système d'.Minuteries ou d'un Système.Threading), de vérifier si elles sont à l'origine de ce code à exécuter sur une forme qui n'a pas été entièrement construit ou est supprimé.
Où est-ce code, quelle méthode ou gestionnaire d'événement?
Si vous avez tous les compteurs en cours d'exécution (Système d'.Minuteries ou d'un Système.Threading), de vérifier si elles sont à l'origine de ce code à exécuter sur une forme qui n'a pas été entièrement construit ou est supprimé.
Où est-ce code, quelle méthode ou gestionnaire d'événement?
OriginalL'auteur senzacionale | 2011-08-24
Vous devez vous connecter pour publier un commentaire.
La différence entre les Invoquer et de BeginInvoke est que le premier est synchrone (attend l'achèvement) tandis que le plus tard est asynchrone (sorte de fire-and-forget). Toutefois, les deux travailler en affichant un message à l'INTERFACE boucle de message qui va provoquer le délégué à être exécuté lorsqu'il reçoit le message.
La InvokeRequired propriété détermine si vous avez besoin d'Invoquer à tout ou si elle est déjà sur le bon thread, pas de savoir si vous voulez synchrone ou asynchrone de l'appelant. Si InvokeRequired est faux vous sont (en théorie) déjà en cours d'exécution sur le thread d'INTERFACE utilisateur et peut simplement effectuer des actions synchrones directement (ou encore BeginInvoke si vous avez besoin de les tirer de manière asynchrone). Cela signifie également que vous ne pouvez pas utiliser Invoquer si InvokeRequired est faux, car il n'y a aucun moyen pour la boucle de message sur le thread en cours pour continuer. Donc, c'est un gros problème avec votre code ci-dessus, mais pas nécessairement à l'erreur, vous êtes à la production de rapports. Vous peut réellement utiliser BeginInvoke dans les deux cas, si vous suivez l'appel récursif, et ainsi de suite.
Cependant, vous ne pouvez pas utiliser l'un sans un handle de fenêtre. Si la Forme/le Contrôle a été instancié mais pas initialisé (ie. avant c'est la première fois), il ne peut pas avoir une poignée de encore. Et la poignée est effacée par Dispose(), comme une fois que le Formulaire est fermé. Dans les deux cas InvokeRequired sera de retour faux car il n'est pas possible d'invoquer sans poignée. Vous pouvez le vérifier IsDisposed, et il y a aussi une propriété IsHandleCreated qui, plus spécifiquement, des tests, si la poignée n'existe. Généralement, si IsDisposed est vrai (ou si IsHandleCreated est faux) que vous souhaitez punt dans un cas particulier comme le simplement tomber le recours comme non applicable.
Donc, le code que vous voulez est probablement plus comme:
Ou peut-être:
c'est aussi pratique pour async tâches appeler des méthodes sur le main thread de l'interface utilisateur, mais la forme est disposé avant l'invoquer est appelé.
OriginalL'auteur
Cela se produit généralement dans multithread scénarios où certaines sources externes (peut-être un NetworkStream) pousse des données à un formulaire avant que le formulaire est correctement initialisé.
Le message peut aussi apparaître après un Formulaire est supprimé.
Vous pouvez vérifier
IsHandleCreated
pour voir si un formulaire est déjà créé, mais vous avez besoin de mettre le tout dans la bonne gestion des erreurs comme laInvoke
instruction peut lever une exception si vous essayez de mettre à jour votre forme pendant que votre demande est en cours de fermeture.OriginalL'auteur
voici ma réponse
Disons que vous voulez écrire"Hello World" sur une zone de texte.
Ensuite, SI vous utilisez "Ishandlecreated de votre opération ne se fera pas si les gestionnaires ne sont pas encore créés. Si Vous devez forcer à CreateHandlers si n'est pas encore créé.
Voici mon code
OriginalL'auteur
Si vous allez utiliser un contrôle à partir d'un autre thread avant de se présenter au contrôle ou à faire d'autres choses avec le contrôle de forcer la création de la poignée dans le constructeur. Ceci est fait en utilisant la CreateHandle fonction. Dans un environnement multi-thread du projet, où le "contrôleur" la logique n'est pas dans une WinForm, cette fonction est essentielle pour éviter ces types d'erreurs.
OriginalL'auteur
En supposant que la forme n'est pas éliminé, mais pas encore entièrement initialisé vient de mettre
var X = this.Handle;
avant queif
déclaration... parthis
l'instance de chaque formulaire est destiné.voir http://msdn.microsoft.com/en-us/library/system.windows.forms.control.handle.aspx .
OriginalL'auteur
Vous êtes probablement à l'appel de cette dans le constructeur de la forme, à ce stade, le système sous-jacent, la poignée de la fenêtre n'existe pas encore.
OriginalL'auteur