Comment puis-je faire de la croix-thread appelle à une ToolStripStatusLabel?
J'ai tendance à utiliser un StatusStrip au fond de la plupart de mes applications pour de simples mises à jour de statut et de temps en temps une barre de progression.
Cependant, il semble ToolStripStatusLabels n'héritent pas de contrôle, de sorte qu'ils n'ont pas .Invoquer, ou .InvokeRequired. Alors, comment aurais-je thread-safe de faire un appel pour modifier le texte de la propriété?
Réponses codées pour la postérité et d'autres qui viennent de la recherche:
Action<string> test=(text) =>
{
if (this._statusStrip.InvokeRequired) this._statusStrip.Invoke(
new MethodInvoker(() => this._lblStatus.Text = text));
else this._lblStatus.Text = text;
};
ou
private void TestInvoker(string text)
{
if (this._statusStrip.InvokeRequired)
this._statusStrip.Invoke(
new MethodInvoker(() => this._lblStatus.Text = text));
else this._lblStatus.Text = text;
}
Soyez prudent dans votre logique de Contrôle.Invoquer. Les règles énoncées dans les docs sont subtiles et sujette à l'erreur si ils ne sont pas les lire attentivement. Veuillez vérifier le code que j'ai dans le lien dans ma réponse pour plus de bien-gardée de l'utilisation de l'Invoquer. E. g., votre application n'est pas que la vérification de la
En plus de la poignée n'étant pas encore créé, Il ressemble à ces affaires ne rien faire en plus de lancer des exceptions si elles se produisent de toute façon, non? Et si la poignée n'est pas encore créé, je ne suis pas sûr que c'est utile de faire semblant de rien n'était et de ne pas lever une exception.
ToolStrip
n'est pas éliminé et il n'est pas de vérifier que le ToolStrip
's de la poignée a été créé.En plus de la poignée n'étant pas encore créé, Il ressemble à ces affaires ne rien faire en plus de lancer des exceptions si elles se produisent de toute façon, non? Et si la poignée n'est pas encore créé, je ne suis pas sûr que c'est utile de faire semblant de rien n'était et de ne pas lever une exception.
OriginalL'auteur Maslow | 2009-07-14
Vous devez vous connecter pour publier un commentaire.
C'est une bonne question!
Tout
ToolStripStatusLabel
n'hérite pas de contrôle, le contenantToolStrip
ne! Utiliser le contenantToolStrip
s'Appeler pour faire des appels à l'encontre de laToolStripStatusLabel
.C'est parce que le ToolStrip manuellement gère le dessin de son composant bits, de la même manière que WPF gère le dessin de tous de sa composante bits, sans générer une poignée spécifique pour chacun. Ceci est utile, car il est facile d'oublier que tous les
Control
est associé à unHANDLE
et le système n'a qu'un nombre fini de ceux à plat, de l'e.g..(J'ai couru dans cette avant aussi. Comme je l'avais mentionné dans un encadré sur une autre question, par exemple. Je devrais mettre à jour ce texte afin de refléter ma plus récente de la compréhension.)
pas nécessairement, mais probablement... alors que les ToolStripStatusLabels sont nécessairement créé sur le même thread que l'StatusStrip
OriginalL'auteur Greg D
Aussi, en général, vous n'avez pas Ont d'utiliser le InvokeRequired et BeginInvoke sur exactement le même contrôle que vous manipulez dans le code, aussi longtemps que vous pouvez garantir que le contrôle de la manipulation a été créé sur le même fil (par exemple, dans les formes de " routine d'initialisation), que l'élément d'INTERFACE utilisateur que vous appelez InvokeRequired /BeginInvoke.
OriginalL'auteur Charles Bretana
Vous pouvez le faire en utilisant la
delegate
mot-clé et le Contrôle.Invoke() de la méthode. Cet exemple montre comment vous gérez un thread-safe .Texte et .ForeColor ajustement.À l'intérieur du contexte de thread, vous pouvez faire un thread-safe appel de cette méthode comme ceci:
OriginalL'auteur Rugbertl
Dans des mots simples, en passant par les StatusStrip Éléments, passer le StatusStrip trop long en paramètre et utilisez-les comme StatusStrip.BeginInvoke ou Invoquer la méthode et du lieu de la barre d'État des éléments à l'intérieur.
Code ci-dessous devrait vous aider à comment appeler et mettre à jour les StatusStrip pas uniquement à partir d'autres Tâches/Thread, mais aussi de l'autre Classe.
Windows Formulaires De Capture D'Écran
OriginalL'auteur Chandraprakash