Pour quelles raisons this.InvokeRequired
est égal à False
au sein de InitUIState()
, car ce nouveau thread est en cours de création via un délégué?Pourquoi InvokeRequired = False via Delegate.BeginInvoke?
Mon problème est que mon étiquette n'est jamais définie et this.BeginInvoke()
ne s'exécute jamais, j'imagine que c'est dû au fait InvokeRequired
= False
.
private delegate void BackgroundOperationDelegate(ViewMode mode);
private BackgroundOperationDelegate backgroundOperationDelegate;
private void FormControlPanel_Load(object sender, EventArgs e)
{
Init();
}
private void Init() {
this.backgroundOperationDelegate = this.InitUIState;
this.backgroundOperationDelegate.BeginInvoke(mode, null, null);
}
private void InitUIState(ViewMode mode)
{
// .. other business logic only here relevant
// to the worker process ..
this.BeginInvoke((MethodInvoker)delegate
{
this.labelProgramStatus.Text = CONSOLE_IDLE_STATUS;
});
}
J'utilise encore cette fois de modèle et le temps, mais pour une raison quelconque, cette fois il n'est pas l'exécution: P (et oui il n'y a qu'une seule instance de InitUIState()
jamais appelé, qu'être du délégué)
Merci les gars.
Images deux fils distincts de vérification:
http://imgur.com/mq12Wl&X5R7G
http://imgur.com/mq12W&X5R7Gl
Suivi question: Est-ce une façon de créer des fils non privilégiées? Je l'ai toujours trouvé si simple et léger. Peut-être que je devrais utiliser thread.Start()
et j'éviterai ces problèmes?
S'il vous plaît montrer plus de code. Est-ce Windows Forms? Quand Init() est-il appelé? –
Jon, je suis honoré de votre présence! Ceci est une application Windows Forms, Init() est dans la routine Form_Load(). Matière à réflexion cependant, la forme sur laquelle les étiquettes changent est actuellement invisible (this.Visible = Faux), la raison en est qu'une procédure dans laquelle il a été appelé via un autre formulaire pour mettre à jour l'interface utilisateur, le formulaire sera alors s'affiche avec l'interface utilisateur la plus récente lorsque l'utilisateur double-clique sur ce formulaire dans la barre d'état système pour l'afficher à l'écran. – GONeale
@GONeale: Il est probablement acceptable qu'il soit invisible, mais la poignée GDI a-t-elle été créée? Sinon, cela pourrait expliquer pourquoi InvokeRequired est faux - il n'est peut-être pas encore prêt. Que se passe-t-il si vous essayez de le placer dans le gestionnaire d'événements HandleCreated à la place? –