Est-il possible de joindre une fonction à un délégué d’action et de le référencer en même temps?
-
20-08-2019 - |
Question
Puis-je intégrer la tâche déléguée au lieu de la séparer sur une autre fonction?
Code d'origine:
private void ofdAttachment_FileOk(object sender, CancelEventArgs e)
{
System.Threading.ThreadPool.QueueUserWorkItem((o) => Attach());
}
void Attach() // I want to inline this function on FileOk event
{
if (this.InvokeRequired)
{
this.Invoke(new Action(Attach));
}
else
{
// attaching routine here
}
}
Je voulais que ce soit comme ça (pas besoin de créer une fonction séparée):
private void ofdAttachment_FileOk(object sender, CancelEventArgs e)
{
Action attach = delegate
{
if (this.InvokeRequired)
{
// but it has compilation here
// "Use of unassigned local variable 'attach'"
this.Invoke(new Action(attach));
}
else
{
// attaching routine here
}
};
System.Threading.ThreadPool.QueueUserWorkItem((o) => attach());
}
La solution
Je pense que cela fonctionnera:
private void ofdAttachment_FileOk(object sender, CancelEventArgs e)
{
Action attach = null;
attach = delegate
{
if (this.InvokeRequired)
{
// since we assigned null, we'll be ok, and the automatic
// closure generated by the compiler will make sure the value is here when
// we need it.
this.Invoke(new Action(attach));
}
else
{
// attaching routine here
}
};
System.Threading.ThreadPool.QueueUserWorkItem((o) => attach());
}
Tout ce que vous avez à faire est d’attribuer une valeur à 'attach' (travail null) avant la ligne qui déclare la méthode anonyme. Je pense cependant que le premier est un peu plus facile à comprendre.
Autres conseils
La raison pour laquelle vous utilisez & "l'utilisation de la variable non affectée &"; Cette erreur est due à la façon dont le compilateur génère le code. Lorsque vous utilisez la syntaxe delegate {}, une méthode réelle est créée pour vous par le compilateur. Puisque vous référencez le champ attaché dans votre délégué, le compilateur tente de transmettre la variable locale attach
à la méthode de délégation générée.
Voici le code traduit approximativement qui devrait vous aider à mieux comprendre:
private void ofdAttachment_FileOk(object sender, CancelEventArgs e)
{
Action attach = _b<>_1( attach );
System.Threading.ThreadPool.QueueUserWorkItem((o) => attach());
}
private Action _b<>_1( Action attach )
{
if (this.InvokeRequired)
{
// but it has compilation here
// "Use of unassigned local variable 'attach'"
this.Invoke(new Action(attach));
}
else
{
// attaching routine here
}
}
Notez que le champ de rattachement est transmis à la méthode _b < > _1 avant son initialisation.