2012-04-07 4 views
0
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 
using System.IO; 
using System.Collections; 

namespace cloud_sync 
{ 
public partial class cloud_sync : ServiceBase 
{ 
    public cloud_sync() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     while (true) 
     { 
      System.Diagnostics.Process proc = new System.Diagnostics.Process(); 

      proc.StartInfo.FileName = "C:\\ec2\\ec2.bat"; 
      proc.StartInfo.RedirectStandardError = false; 
      proc.StartInfo.RedirectStandardOutput = false; 
      proc.StartInfo.UseShellExecute = true; 
      proc.Start(); 
      proc.WaitForExit(); 

      string[] filePaths = Directory.GetFiles(@"c:\My cloud\VM Instances\"); 
      foreach (string filePath in filePaths) 
       File.Delete(filePath); 
      try 
      { 
       StreamReader sr = new StreamReader("c:/ec2/temp.txt"); 

       if (new FileInfo("c:/ec2/temp.txt").Length > 0) 
       { 
        string line, temp, temp1; 
        string[] content = new string[4]; 
        line = GetWord(sr); 
        line = GetWord(sr); 
        string[] terms = line.ToLower().Trim().Split('\t'); 

        Console.WriteLine(terms[1]); 
        Console.WriteLine(terms[5]); 
        Console.WriteLine(terms[9]); 
        temp1 = terms[1]; 
        content[0] = "Instance_id :" + terms[1]; 
        content[1] = "Status :" + terms[5]; 
        content[2] = "Type :" + terms[9]; 
        if (terms[5].Equals("terminated")) 
        { 
         line = GetWord(sr); 
        } 
        else 
        { 
         line = GetWord(sr); 
         line = GetWord(sr); 
        } 



        terms = line.ToLower().Trim().Split('\t'); 
        Console.WriteLine(terms[4]); 
        content[3] = "Name :" + terms[4]; 
        int i = terms[4].Length; 

        temp = "c:/My cloud/VM Instances/" + temp1 + " (" + terms[4] + ")"; 
        temp = temp + ".cvm"; 
        File.WriteAllLines(temp, content); 


        while ((line = GetWord(sr)) != null) 
        { 
         line = GetWord(sr); 
         terms = line.ToLower().Trim().Split('\t'); 

         Console.WriteLine(terms[1]); 
         Console.WriteLine(terms[5]); 
         Console.WriteLine(terms[9]); 
         temp1 = terms[1]; 
         content[0] = "Instance_id :" + terms[1]; 
         content[1] = "Status :" + terms[5]; 
         content[2] = "Type :" + terms[9]; 
         if (terms[5].Equals("terminated")) 
         { 
          line = GetWord(sr); 
         } 
         else 
         { 
          line = GetWord(sr); 
          line = GetWord(sr); 
         } 

         terms = line.ToLower().Trim().Split('\t'); 
         Console.WriteLine(terms[4]); 
         content[3] = "Name :" + terms[4]; 
         i = terms[4].Length; 

         temp = "c:/My cloud/VM Instances/" + temp1 + " (" + terms[4] + ")"; 
         temp = temp + ".cvm"; 
         File.WriteAllLines(temp, content); 
        } 
       } 
       sr.Close(); 
       sr.Dispose(); 
       System.Threading.Thread.Sleep(50000); 
       File.Delete("c:/ec2/temp.txt"); 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 

     } 
    } 
    protected override void OnStop() 
    { 
    } 

    static string GetWord(StreamReader sr) 
    { 
     return sr.ReadLine(); 
    } 

}  
} 

J'ai écrit ce service de système, mais quand je commence à ce service, il me marge d'erreur de « Windows n'a pas pu démarrer le service cloud_sync sur l'ordinateur local Erreur:. 1053 service n'a pas répondu à la demande de démarrage et de contrôle en temps opportun. " et après avoir appuyé sur ok son état devient" démarrage ". S'il vous plaît dites quel est le problème avec cela. Je suis greenhorn en C#, ceci est mon premier service système. s'il vous plaît aidez-moi hors de ceerreur d'affichage de service du système au moment du démarrage

+0

Console.WriteLine est ignorée dans les services widows, utilisez EventLog.WriteEntry et consignez les exceptions dans le journal des événements Windows –

+0

qu'essayez-vous d'accomplir? –

Répondre

2

Vous recevez Windows could not start the cloud_sync service on local computer. Error: 1053 the service did not respond to start and control request in timely fashion parce que votre OnStart() ne revient pas. Vous devez essorer un autre thread pour exécuter le code désiré.

private Task _serviceTask; 
private bool _stop; 

protected override void OnStart(string[] args) 
{ 
    _serviceTask = Task.Factory.StartNew(SomeTask) 
} 

// Rename the method from SomeTask to something that makes more sense 
private static void SomeTask() 
{ 
    // Move your code here 
} 

Vous devez remplacer votre while(true) à while(!_stop) afin que vous puissiez finir avec élégance la boucle dans OnStop().

+0

Merci pour votre réponse. Je l'ai. Mais je n'ai pas obtenu votre dernière ligne "Vous devriez remplacer votre while (true) à while (! _ Stop) afin que vous puissiez terminer la boucle dans OnStop()". Comment terminer la boucle dans onstop()? – manish

+0

@manish, lorsque votre service est invité à s'arrêter, 'OnStop()' est appelé. Idéalement, votre méthode 'OnStop()' devrait terminer votre boucle. En ce moment vous semblez boucler pour toujours. – Tung

+0

Comment puis-je faire cela? Je veux dire comment puis-je terminer la boucle dans la fonction OnStop()? – manish

Questions connexes