IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

De la bonne utilisation des fonctions asynchrones et des timers.


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 23
    Points
    23
    Par défaut De la bonne utilisation des fonctions asynchrones et des timers.
    Bonjour,

    J'ai volontairement regroupé deux choses différentes pour éviter de créer un deuxieme topic inutile.

    Au sujet des fonctions asynchrones :

    - Sur quels critères vous basez vous pour utiliser une méthode asynchrone ? Cela dépend il de la taille des donnée à traiter (une énorme liste par exemple) ? de la localisation des données (donnée stockée à distance, etc), ou d'autres choix ? Si cela dépend de la taille des données, à partir de quel moment cela devient il nécessaire (un ordre de grandeur si possible).

    - Si une fonction ne retourne rien, l'asynchrone est donc inutile ?

    - Une méthode non synchrone appelée dans une callback asynchrone fait elle implicitement d'elle une méthode asynchrone ou cela n'a absolument rien à voir?




    Au sujet des timers :

    - Que privilégiez quant à leur utilisation des timers ?

    Admettons que je dois appeler une ou des méthodes sur 500 objets toutes les 3 secondes, vaut il mieux que chaque objet dispose de son propre timer ou qu'un timer général s'occupe d'appeler une méthode qui va itérer la collection d'objet pour effectuer les traitements. Comparativement, quelle est la meilleure option ?

    - D'autres conseils à adresser à un débutant ?

    Merci d'avance.

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    - Sur quels critères vous basez vous pour utiliser une méthode asynchrone ? Cela dépend il de la taille des donnée à traiter (une énorme liste par exemple) ? de la localisation des données (donnée stockée à distance, etc), ou d'autres choix ? Si cela dépend de la taille des données, à partir de quel moment cela devient il nécessaire (un ordre de grandeur si possible).
    Ce sont des questions intéressantes. Malheureusement, il n'y a pas de bonnes réponses, chaque cas peut être différent. Néanmoins, il y en a un qui revient très souvent (et c'est d'ailleurs pour cela que les fonctions asynchrones ont été introduites) : la gestion des interfaces utilisateurs (IHM).

    Typiquement, si sur un clic sur un bouton, tu déclenches le téléchargement d'un fichier de manière synchrone, alors tu bloques complètement ton IHM le temps du téléchargement (le fameux : se programme ne répond pas). Pour éviter cela, on utilise les méthodes asynchrones. Dès lors, quand choisir une méthode asynchrone plutôt que son pendant synchrone ? Dès lors que l'action peut prendre du temps et être perceptible par l'être humain (je sais, c'est très subjectif).

    En gros, cela ne dépend pas directement de la taille des données, de la méthode de récupération, etc... Le critère véritablement important c'est le temps nécessaire à l'exécution de ta fonction. Et c'est un critère si ce temps est perceptible (par ex. gèle de l'interface utilisateur).

    C'est ce que je qualifierai de premier critère, car c'est celui que l'on rencontre sans doute le plus souvent. Mais il peut y avoir d'autres exemples où l'utilisation de fonctions asynchrones peut être tout aussi pratique. Par exemple, un gestionnaire de paquets peut commencer à installer des paquets dès que les premiers paquets sont arrivés. Il n'est pas obligé d'attendre le téléchargement de l'intégralité des paquets pour commencer leur installation. Plus généralement, dès lors que tu as un aspect producteur/consommateur l'asynchrone peut être pratique (puisque tu autorises les deux à se produire en même temps).

    Après, c'est du cas par cas. Mais déjà, là tu réponds à pas mal de besoin

    - Si une fonction ne retourne rien, l'asynchrone est donc inutile ?
    Non. Au contraire. Imagine que sur une action d'un utilisateur, le programme doive envoyer une notification par mail. Tu peux le faire en asynchrone, de tel sorte que cela ne bloque pas le programme.

    - Une méthode non synchrone appelée dans une callback asynchrone fait elle implicitement d'elle une méthode asynchrone ou cela n'a absolument rien à voir?
    Si tu parles d'un callback déclaré avec le mot clé async, alors cela n'a rien à voir. En effet ce n'est pas parce que tu déclares une méthode avec async qu'elle est asynchrone. Il faut obligatoirement qu'il y ait aussi le mot clé await dans le corps de ta méthode (c'est au niveau du await que la méthode va être interrompue pour laisser place à l'asynchrone). Si tu définies une méthode avec le mot clé async mais sans await dans son corps (possible, tu n'auras qu'un avertissement lors de la compilatino), ta méthode sera toujours synchrone.

    Admettons que je dois appeler une ou des méthodes sur 500 objets toutes les 3 secondes, vaut il mieux que chaque objet dispose de son propre timer ou qu'un timer général s'occupe d'appeler une méthode qui va itérer la collection d'objet pour effectuer les traitements. Comparativement, quelle est la meilleure option ?
    D'une manière générale, la plus efficace sera le timer générique par rapport à un timer dédié. Moins de ressources à allouer, moins de changement de contexte. Mais après, tout dépend encore une fois du contexte. Par exemple, s'il s'agit de récupérer la date de mofication de 300 fichiers sur le disque, cela sera la méthode la plus efficace. S'il s'agit de télécharger 300 fichiers sur le net, alors il faut mieux que chaque objet ait son timer dédié.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

Discussions similaires

  1. Utiliser les Namespace pour appeler des fonctions
    Par Flamby38 dans le forum VB.NET
    Réponses: 2
    Dernier message: 30/01/2008, 17h27
  2. [DOM] utiliser les fonctions Node sur des balises html
    Par durthu dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/10/2007, 14h42
  3. utiliser une fonction VOID pour des blocs relationnels ?
    Par ctobini dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 11/09/2006, 16h16
  4. Réponses: 6
    Dernier message: 22/05/2006, 13h54
  5. Creer des fonctions qui émule des fonctions Access
    Par steelidol dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/05/2006, 18h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo