2 votes

Existe-t-il un moyen de mettre en ligne une fonction dans un délégué d'action et de la référencer en même temps ?

Existe-t-il un moyen de mettre en ligne la tâche déléguée au lieu de la séparer dans une autre fonction ?

Code original :

    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());
    }

4voto

Jonathan Rupp Points 10900

Je pense que ça va marcher :

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());
}

Il suffit d'attribuer une valeur à "attach" (null works) avant la ligne qui déclare la méthode anonyme. Je pense que la première méthode est un peu plus facile à comprendre.

0voto

Paul Alexander Points 17611

La raison pour laquelle vous obtenez l'erreur "use of unassigned variable" 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 faites référence au champ attaché dans votre délégué, le compilateur tente de passer la variable locale attach à la méthode de délégation générée.

Voici le code traduit grossièrement qui devrait aider à le rendre plus clair :

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
    }
}

Remarquez qu'il passe le champ attaché à la méthode _b<>_1 avant qu'elle ne soit initialisée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X