Invoke de différents fils
Question
Je ne peux pas le croire, cela fonctionne dans mon autre application, mais dans celui-ci, qui a une structure similaire - il n'a pas
public string ListAdd
{
set
{
if (listView1.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate
{
listView1.Items.Add(value);
});
}
else
{
listView1.Items.Add(value);
}
}
}
La façon dont je l'appelle:
var formz = Form.ActiveForm as Form1;
if (formz != null)
formz.ListAdd = "asdasdasdasd";
Si je l'appelle de la fonction où je reçois paquet (je veux le mettre sur le listView) sur TCP - Rien ne se passe, mais si je l'appelle dans cette même classe où j'initialiser WinSock -. Cela fonctionne
Si le problème pourrait être?
EDIT: Je viens débogués l'application, formZ est nulle à l'endroit où je l'appelle (fonction de réception). Pourquoi est-il nul là-bas, mais pas à tout autre endroit?
La solution
Je ne pense pas, il va résoudre votre problème, mais avez-vous pensé à utiliser le modèle suivant pour faire le Invoke? Je considère qu'il est beaucoup plus facile à lire. Créer cette méthode d'extension.
public static class ControlExtension
{
public static void ThreadSafeInvoke(this Control control, MethodInvoker method)
{
if (control != null)
{
if (control.InvokeRequired)
{
control.Invoke(method);
}
else
{
method.Invoke();
}
}
}
}
Et vous pouvez effectuer fil méthode sûre appelle comme ça.
Form form = new Form();
form.ThreadSafeInvoke(() => form.Text = "ThreadSafeInvoke");
Ou plusieurs appels à la fois.
form.ThreadSafeInvoke(() =>
{
form.Text = "ThreadSafeInvoke";
form.Visible = true;
form.WindowState = FormWindowState.Maximized;
});
UPDATE
Le problème est donc clairement Form.ActiveForm
retour null
.
- Il n'y a aucune forme active au moment de l'appel.
- Le fil n'a pas l'autorisation d'obtenir la forme active - états MSDN
Autres conseils
Si ActiveForm retourne null vous pourriez ne pas avoir une forme active ou il est pas de type Form1. Vous utilisez « comme Form1 », donc si vous avez un Form2 qui est actif alors formZ sera réglé sur null.
Pouvez-vous passer formZ dans la fonction au lieu d'appeler ActiveForm?
Vérifiez si vous êtes en mode débogage; Si oui, le forme active valeur retournée sera nulle.