Servizio di windows

di il
6 risposte

Servizio di windows

Ciao a tutti carissimi, sto facendo un esercizio di creazione di un servizio windows che gira in background. Questo servizio dovrebbe monitorare una cartella e spostare i file in un'altra appena ve ne viene aggiunto uno. Il problema è che il mio servizio lo fa solo la prima volta quando avvio il servizio ma poi non parte l'automatismo. Mi potete dare un consiglio??? Vi posto il codice che ho prodotto:
public partial class Service1 : ServiceBase
{
private Timer tmr = null;


public Service1()
{
InitializeComponent();
}

protected override void OnStart(string[] args)
{
moveFile();
WriteToFile("Timer avviato " + DateTime.Now);
tmr = new Timer();
tmr.Interval = 1000;
tmr.Elapsed += new ElapsedEventHandler(tmr_Elapsed);
tmr.Enabled = true;

}

private void tmr_Elapsed(object sender, ElapsedEventArgs e)
{
WriteToFile("Service is recall at " + DateTime.Now);
}

protected override void OnStop()
{
WriteToFile("Timer disattivato.");
}


private static void MoveFiles(string sourceDir, string destDir)
{
string[] files = Directory.GetFiles(sourceDir);

foreach (string file in files)
{
string dest = file.Replace(sourceDir, destDir);
FileInfo f = new FileInfo(file);
string ext = f.Extension;
if (!File.Exists(dest))
{
File.Move(file, dest);
}
}
}

public void moveFile()
{
string path = @"c:\from";
string path2 = @"c:\to";
try
{
MoveFiles(path, path2);
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
}

public void WriteToFile(string Message)
{
string path = AppDomain.CurrentDomain.BaseDirectory + "\\Logs";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string filepath = AppDomain.CurrentDomain.BaseDirectory + "\\Logs\\ServiceLog_" + DateTime.Now.Date.ToShortDateString().Replace('/', '_') + ".txt";
if (!File.Exists(filepath))
{
// Create a file to write to.
using (StreamWriter sw = File.CreateText(filepath))
{
sw.WriteLine(Message);
}
}
else
{
using (StreamWriter sw = File.AppendText(filepath))
{
sw.WriteLine(Message);
}
}
}
}
}

6 Risposte

  • Re: Servizio di windows

    Non vedo lo Start del timer.

    In ogni caso in un servizio è meglio lanciare un nuovo thread e non usare un timer
  • Re: Servizio di windows

    In effetti il timer messo gestisce solo i log che ha il suo start nel metodo onStart.
    Quindi se usassi il timer per regolare il processo di automazione dovrei creare un altro metodo da passare alla classe tmr.Elapsed += new ElapsedEventHandler(....); Ho capito capito bene?
  • Re: Servizio di windows

    Non ho capito che intendi.

    I servizi usano un thread creato nella onstart ed eventuali altri thread creati all'interno del primo se necessari. A te basta il primo che esegue un loop controllato da uno sleep
  • Re: Servizio di windows

    Puoi usare la classe FileSystemWatcher che trovi nel namespace System.IO
  • Re: Servizio di windows

    oregon ha scritto:


    Non ho capito che intendi.

    I servizi usano un thread creato nella onstart ed eventuali altri thread creati all'interno del primo se necessari. A te basta il primo che esegue un loop controllato da uno sleep
    Ti ringrazio del tuo aiuto!
    Allora ho creato il thread nell'on start
    protected override void OnStart(string[] args)
    {
    Thread t = new Thread(new ThreadStart(moveFile));
    t.Start();
    Thread.Sleep(1000);
    WriteToFile("Timer avviato " + DateTime.Now);
    tmr = new System.Timers.Timer();
    tmr.Interval = 1000;
    tmr.Elapsed += new ElapsedEventHandler(tmr_Elapsed);
    tmr.Enabled = true;

    }
    Purtroppo deve esserci un errore. Lo sleep va sotto allo start oppure nel metodo che sposta i file? In realtà ho provato entrambi ma non ha funzionato
  • Re: Servizio di windows

    Ciao alla fine o risolto, ho usato un altro oggetto timer per creare il meccanismo di automazione. Grazie a tutti per l'aiuto!
Devi accedere o registrarti per scrivere nel forum
6 risposte