2010-11-23 9 views
0

J'utilise un service Windows pour exécuter ffmpeg.exe pour convertir des fichiers vidéo. Je fais cela en regardant un processus dans C# .net. Le problème est queLe service Windows ne démarre pas lors de l'utilisation d'un processus pour exécuter un fichier exe via C# .net

Mon code dans le OnStart() du service Windows est la suivante:

FilArgs = string.Format("-i {0} -ar 22050 -qscale 1 {1}", InputFile, OutputFile); 

Process proc; 
proc = new Process(); 

try 
{ 
    proc.StartInfo.FileName = spath + "\\ffmpeg\\ffmpeg.exe"; 
    proc.StartInfo.Arguments = FilArgs; 
    proc.StartInfo.UseShellExecute = false; 
    proc.StartInfo.CreateNoWindow = false; 
    proc.StartInfo.RedirectStandardOutput = true; 
    proc.StartInfo.RedirectStandardError = true; 

    eventLog1.WriteEntry("Going to start process of convertion"); 

    proc.Start(); 

    string StdOutVideo = proc.StandardOutput.ReadToEnd(); 
    string StdErrVideo = proc.StandardError.ReadToEnd(); 

    eventLog1.WriteEntry("Convertion Successful"); 
    eventLog1.WriteEntry(StdErrVideo);    

} 
catch (Exception ex) 
{ 
    eventLog1.WriteEntry("Convertion Failed"); 
    eventLog1.WriteEntry(ex.ToString());    
} 
finally 
{ 
    proc.WaitForExit(); 
    proc.Close(); 
} 

quand j'ai essayé de convertir de gros fichiers vidéo (je l'ai vécu lorsque la taille du fichier est> 14MB) comme mentionné ci-dessus le service ne parvient pas à démarrer et est dans le statut "démarrage".

Le ffmpeg lors de l'exécution directe de l'invite de commande fonctionne également pour les fichiers plus volumineux.

Tout me plaît comment résoudre ce ...

Répondre

5

qui est mauvais parce onstart() ne devrait commencer à un fil d'arrière-plan pour la boucle des travailleurs. OnStart() devrait revenir à peu près immédiatement, donc pas de travail de longue haleine doit être fait là-bas.

Windows attend que OnStart() renvoie un délai d'expiration et, dans le cas contraire, le tue.

Fondamentalement, vous commencez un fil là-bas:

private Thread _workerThread; 
private bool _closing = false; 
... OnStart(...) 
{ 
    _workerThread = new Thread(new ThreadStart(Work)); 
    _workerThread .Start(); 

} 

private void Work() 
{ 
    while(!_closing) 
    { 
    // do the processing if there is work otherwise sleep for say 10 seconds 
    } 
} 


... OnStop(...) 
{ 
    _closing = true; 
    _workerThread.Abort() 
} 
+0

Merci pour votre réponse .. Mais j'ai des problèmes avec les opérations de fichiers prennent beaucoup de temps. Après l'exécution de la fonction via le thread comme vous l'avez mentionné, le service commence maintenant normalement. Mais le problème est que ma fonction ne se termine pas. Quand j'ai vérifié mon eventlog il a montré le log que j'ai fait juste avant proc.Start(); (c'est-à-dire, "Commencer le processus de conversion") Comment puis-je me débarrasser de ce problème? – Harun

+0

Le problème avec le service est maintenant résolu et la question d'origine est répondue. Maintenant vous semblez avoir un autre problème avec le traitement des données, donc je vous suggère de créer une nouvelle question sans le service. Je ne suggère pas de mettre à jour cette même question car elle va le polluer. – Aliostad

+0

ok .. Je le ferai. – Harun

Questions connexes