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:
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).
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);
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:
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.
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); }
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.
Partager