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

ASP.NET Discussion :

Exécution d'un process en asynchrone [Débutant]


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Par défaut Exécution d'un process en asynchrone
    Bonjour à tous,

    Je viens de récupérer une page Web codée en C#. Cette page permet, grâce à un bouton, de lancer un .bat côté serveur qui lance lui même SQLLoader pour charger un fichier .CSV dans une table temporaire, puis lance une procédure stockée pour effectuer des traitements métier et les injecter dans 1 ou plusieurs tables cibles.
    L'exécution se fait graâce à la commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ProcessStartInfo startInfo = new ProcessStartInfo(Environment.GetEnvironmentVariable("DIR")+"\\load\\load.cmd");
    myProcess = Process.Start(startInfo);
    Cela marche plutôt pas mal, mise à part le fait que lorsque le volume de données à injecter est important, et donc le traitement est long, alors l'exécution tombe en Timeout. (La procédure stokée poursuit bien côté Oracle, mais .net et/ou iss lève un timeout).

    J'ai donc pensé à passer le traitement en asynchrone, et mettre sur l'IHM un petit message du genre "traitement en cours" avec un petit icone qui tourne.

    J'ai donc modifier mon code afin de mettre l'éxécution dans un thread comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    try{
    			Process myProcess = null;			
    			ProcessStartInfo startInfo = new ProcessStartInfo(Environment.GetEnvironmentVariable("DIR")+"\\load\\load.cmd");			
    			startInfo.Arguments = loginUser.Value;
     
    			ThreadPool.QueueUserWorkItem(delegate {
     
    				myProcess = Process.Start(startInfo);
     
    				if(myProcess.WaitForExit(99999999)) {
    					msgRetour.Value = "La procédure d'import est terminé. Veuillez vérifier les logs.";
    					messagetxt.Attributes["class"] = "message";
    				} else {
    					msgRetour.Value = "TIMEOUT";
    					messagetxt.Attributes["class"] = "message";
    				}
     
    			});
     
    			while (!myProcess.HasExited)
    			{
    				Thread.Sleep(1000);
    				msgRetour.Value = "Veuillez patienter pendant les traitements d'import.";
    				messagetxt.Attributes["class"] = "message";
    			}
     
    			msgRetour.Value = "AFTER THREAD";
    			messagetxt.Attributes["class"] = "message";
     
    			// Je renitialise les fichiers importes
    			fichImp.InnerHtml = "";
     
    		}
    		catch (Exception p) {
    		throw (p);
    		}
    Mon problème est que ma variable myProcess (dans mon while) n'a pas l'air d'être reconnue dans ce contexte. J'ai le message d'erreur suivant sur lancement du traitement: La référence d'objet n'est pas définie à une instance d'un objet.
    Je ne sais pas si la méthode est la bonne pour répondre à mon besoin. Sachant que je ne peux pas modifier toute l'architecture, et que je suis pas habitué à ce language.

    Auriez-vous une idée concernant mon problème? Merci beaucoup d'avance.

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    En ASP.NET l'approche est un peu différente, les contraintes n'étant pas les mêmes. Tu peux regarder du côté des Pages Asynchrones, et des PageAsyncTask.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,
    Citation Envoyé par critok Voir le message
    donc le traitement est long, alors l'exécution tombe en Timeout
    Tu entends quoi par long? Combien de temps? Tu peux augmenter le temps d'attente grâce au fichier de configuration. Mais cela ne te protégera pas d'une interruption de réseau ou une fermeture intempestive du navigateur.

    Puisque tu utilises un thread tu peux le laisser partir sans attendre de retour. Une fois le traitement terminé tu mets à jour un paramètre dans ta base ou tu laisses un fichier spécifique pour dire que le traitement est OK.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Salut,Tu entends quoi par long? Combien de temps? Tu peux augmenter le temps d'attente grâce au fichier de configuration. Mais cela ne te protégera pas d'une interruption de réseau ou une fermeture intempestive du navigateur.

    Puisque tu utilises un thread tu peux le laisser partir sans attendre de retour. Une fois le traitement terminé tu mets à jour un paramètre dans ta base ou tu laisses un fichier spécifique pour dire que le traitement est OK.

    A+
    Bonjour,

    Merci pour vos réponses.

    Certains traitements durent plus de 5min (parfois 10mn selon la volumétrie du fichier .csv en entrée). Et comme le Timeout est positionné sur 120s...
    J'ai bien pensé à augmenter le timeout .net et IIS mais cela ne me semble pas correct.

    Au dela de ce problème de Timeout, il y a également le fait que l'utilisateur ne soit pas informé du statut du traitement.
    Actuellement, l'utilisateur clique sur le bouton, le traitement se lance, et la page rend la main uniquement lorsque le traitement est terminé. Comme la page / IE se bloquent et que le traitement et parfois long, certains utilisateur pensent que tous est planté.

    C'est pour cela que je souhaiterais partir sur une méthode qui permette de lancer le traitement en tache de fond, et montrer à l'utilisateur que le traitement est en cours, via une gif qui tourne par exemple sur ma fenêtre principale, ou bien via une popup temporaire avec un "Loading" et une image animée qui disparaîtraient en fin de traitement.

    J'ai également pensé mettre à jour un paramètre en base mais je voulais éviter de faire des allez retour en base toute les x secondes et pensais pouvoir traiter directement dans la page.

    Dans mon exemple le traitement se lance bien en tâche de fond mais lorsque je fais mon while, il n'a pas l'air de voir ma variable myProcess initiallisée (alors qu'elle l'est pourtant dans le thread).

    Si j'avais la possibilité de récupérer cette variable, je pourrais boucler en conséquence pour voir le statut du traitement.

    Je vais regarder du côté des PageAsyncTask comme conseillé par DotNetMatt mais sans connaissance C# c'est un peu hard

    Merci à vous.

  5. #5
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par critok Voir le message
    du côté des PageAsyncTask
    En reprenant l'exemple sur la MSDN, on constate que la page ne restitue aucune information dans le navigateur avant d'avoir complètement fini. Ton problème restera le même.

    Avant de penser au C# pense déjà à ce que tu veux dans le langage que tu connais.
    "Winter is coming" (ma nouvelle page d'accueil)

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    En reprenant l'exemple sur la MSDN, on constate que la page ne restitue aucune information dans le navigateur avant d'avoir complètement fini. Ton problème restera le même.

    Avant de penser au C# pense déjà à ce que tu veux dans le langage que tu connais.
    Effectivement, j'ai transposé l'exemple MSDN dans mon application, et on ne peut pas restituer d'information tant que le traitement n'est pas terminé

    En fait, j'ai hérité de cette application en l'état, basé sur un progiciel codée en javascript et asp pour les appels BD et C# (pour l'exécution du .bat), et je ne peux pas modifier complétement la fonctionnalité, et les écrans car les utilisateurs sont habitués.

    Dans le pire des cas, je peux sur clique du bouton:

    0/ Je vérifie qu'un traitement n'est pas en cours sur le user qui clique sur le bouton. Si Ok on poursuit, Si Ko on ne lance pas le traitement et j'affiche un message.
    1/ via C# j'apelle un bout de code javascript qui log une entrée dans une table "traitement" Exemple: Traitement id=1634163, User= TOTO, Type=ImportPersonnes, Statut=Encours
    2/ Je lance mon .cmd via C# en mode asynchrone via un thread (comme dans mon exemple)
    Le CMD va lancer SQLLoader, puis la procédure stockée. A la fin de la PS, je rajoute un update pour passer le traitement à Finish.
    3/ De suite et toujours via C# je lance une popup modale (avec un loading) qui va scruter (en javascript / asp) toute les 5 secondes si le traitement est terminé (statut=finish pour le type de traitement et le user donné).
    Si traitement terminé, on ferme la popup et j'affiche le résultat, si pas terminé, je continue à boucler.

    Qu'en pensez vous?

  7. #7
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par critok Voir le message
    Qu'en pensez vous?
    Ca me parait un bon début.
    "Winter is coming" (ma nouvelle page d'accueil)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/03/2012, 11h01
  2. Réponses: 1
    Dernier message: 28/10/2011, 11h43
  3. Exécution d'un process orphelin
    Par jgalbois dans le forum Apache
    Réponses: 3
    Dernier message: 19/08/2010, 16h56
  4. exécution d'un process en c# 2.0
    Par tatikambwa dans le forum C#
    Réponses: 4
    Dernier message: 24/10/2008, 18h56
  5. Lancer exécutable en asynchrone
    Par ZeKiD dans le forum ANT
    Réponses: 4
    Dernier message: 30/03/2004, 16h42

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