none
Problème avec les threads et Socket RRS feed

  • Discussion générale

  • Tout fonctionnait à merveille, tout à coup aujourd'hui je reçois ce message d'erreur lors de l'exécution.

    PS: Je ne fais aucune modification du code source.

    mardi 9 août 2011 14:28

Toutes les réponses

  • Bonjour, Juvénal Vangu,

    Est-ce que vous avez pu avancer en utilisant les informations trouvées sur le lien d’Eouldmourad ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

     

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 11 août 2011 06:53
  • Bonjour,

    Le BackgroundWorker est très pratique mais il est assez complexe. L'idée générale est qu'il n'est pas possible de manipuler le contenu de l'écran (fenêtres, boites de message, de dialgues, menus...) dans une thread qui n'est pas interactive et qui n'est pas celle qui a été utilisée pour créer l'élément. Par défaut dans une application Windows il y a une seule thread interactive et c'est la thread initiale/principale de l'application.

    Le BackgroundWorker est particulièrement adapté pour afficher le résultat une fois un traitement long effectué en tâche de fond et permet même de gérer la progression en notifiant la thread interactive de la progression à partir de la thread de background.

    Pour un cas simple comme le votre : Afficher une MessageBox sur une Exception, vous devez savoir que la grande majorité des éléments graphiques Windows Form (les Forms et Controls en particulier) ont une méthode Invoke() qui permet de basculer temporairement dans la thread interactive du composant et dans WPF la grande majorité des éléments graphiques ont une propriété Dispatcher qui elle même a une méthode Invoke(). L'appel de la méthode Invoke est un peu technique.

    mainForm.Dispatcher.Invoke(

        (Action<Exception>)delegate(Exception e)

        {

             MessageBox.Show(e.ToString());

        },

        E);

    Le premier paramètre d'Invoke est une méthode anonyme convertie en Delegate grace à Action<TArg1>. Cette méthode anonyme sera exécutée dans le thread qui a créé la fenêtre principale et donc marchera. Le second paramètre (E) indique ce qui sera passé comme paramètre ea à la méthode anonyme. A la place de la méthode anonyme, il est possible d'utiliser une lambda expression ce qui donne:

    mainForm.Dispatcher.Invoke((Action<Exception>)(e => MessageBox.Show(e.ToString())), E);

    Ce qui est plus concis mais pas beaucoup plus parlant. Vous aurrez tout intéret à encapsuler cela dans une méthode du type BackgroundShowException(ex). Vous noterez également qu'en plus de Invoke, il existe un BeginInvoke qui lance la méthode dans la thread interactive et continue l'exécution de la thread d'arrière plan sans attendre la fin de la méthode invoquée (ici que l'utilisateur est pressé sur un des boutons de la boite de message. Enfin si vous attendez le résultat de la boite de message dans votre thread d'arrière plan vous pourrez utiliser :

    var res = (MessageBoxResult)mainForm.Dispatcher.Invoke((Func<Exception,MessageBoxResult>)(e => return MessageBox.Show(e.ToString())), E);

    Cordialement,

    Renaud

    mardi 30 août 2011 23:07