Pagina 3 di 5 primaprima 1 2 3 4 5 ultimoultimo
Visualizzazione dei risultati da 21 a 30 su 42
  1. #21
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,886
    Scusa il ritardo, il servizio che usavo per fare lo scan dell'eventlog di Windows ogni mezzanotte (ci sono le using che servivano, non le ho tolte, ma puoi usarlo per qualsiasi cosa da schedulare ogni giorno).


    program.cs:
    codice:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.ServiceProcess;
    using System.Text;
    using System.Threading.Tasks;
    
    
    namespace ScanEventLogService
    {
        static class Program
        {
            static void Main()
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[]
                {
                    new EventLogService() // Classe che fa qualcosa ogni mezzanotte, io l'ho chiamata "eventlog" perche' scandagliava l'event log di Windows, ovvamente si puo' cambiare nome
                };
    
    
                ServiceBase.Run(ServicesToRun);
            }
        }
    }



    EventLogService.cs:
    codice:
    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.Threading.Tasks;
    using System.Timers;
    using System.Windows.Threading;
    using System.Configuration;
    using System.IO;
    using System.Net.Mail;
    using System.Net;
    
    
    namespace ScanEventLogService
    {
        public partial class EventLogService : ServiceBase
        {
            private Timer timer;
    
    
            public EventLogService()
            {
                InitializeComponent();
            }
    
    
            protected override void OnStart(string[] args)
            {          
                //  MidnightTimer
                MidnightTimer UomoInFrack = new MidnightTimer();
                UomoInFrack.Elapsed += (s, e) => OnTimer();
                UomoInFrack.Start();
            }
    
        
            public void OnTimer()
            {
                try
                {
                   // fai le tue cose (mettici un LOG)
                }
                catch (Exception ex)
                {
                    // throw;
                }
            }
    
    
        
            protected override void OnStop()
            {
                // ... 
            }
        }
    }




    la classe per l'attivazione a 00:00 (presa da https://www.codeproject.com/Articles...it-is-Midnight):
    codice:
    using Microsoft.Win32;
    using System;
    using System.Threading;
    using System.Timers;
    
    
    internal class MidnightTimer
    {
       
        internal event EventHandler Elapsed = delegate { };
        private System.Timers.Timer timer;
        private DateTime previousRun;
    
    
        internal MidnightTimer()
        {
            SystemEvents.TimeChanged += SystemEvents_TimeChanged;
    
    
            timer = new System.Timers.Timer();
            timer.AutoReset = false;
            timer.Elapsed += timer_Elapsed;
        }
    
    
        internal void Start()
        {
            previousRun = DateTime.Today;
    
    
            TimeSpan timeSpanToMidnight = GetNextMidnight().Subtract(DateTime.Now);
            timer.Interval = timeSpanToMidnight.TotalMilliseconds;
            timer.Start();
        }
    
    
        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            if (previousRun != DateTime.Today)
                Elapsed(this, EventArgs.Empty);
    
    
            timer.Stop();
            Start();
        }
    
    
        private void SystemEvents_TimeChanged(object sender, EventArgs e)
        {
            timer.Stop();
            Start();
        }
    
    
        private static DateTime GetNextMidnight()
        {
            return DateTime.Today.AddDays(1);
        }
    }


    Il servizio va installato ed il giorno dopo controlli se ha prodotto il log (oppure se ha fatto cio' che doveva).
    Ultima modifica di djciko; 13-07-2020 a 10:37

  2. #22
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,857
    allora, premesso che sto lavorando in vb, ho convertito il codice:
    se ho capito bene midnighttimer e program sono due classi mentre il servizio vero e proprio è EventLogService

    Pertanto io ho convertito in vb in questo modo:classe midnightTimer.vb (ho evidenziato l'unica differenza di codice sostanziale che mi pare di rilevare)
    codice:
    Imports Microsoft.Win32
    Imports System.Threading
    Imports System.Timers
    
    Friend Class MidnightTimer
       Friend Event Elapsed As EventHandler
       Private timer As Timers.Timer
       Private previousRun As DateTime
    
       Friend Sub New()
          AddHandler SystemEvents.TimeChanged, AddressOf SystemEvents_TimeChanged
          timer = New Timers.Timer()
          timer.AutoReset = False
          AddHandler timer.Elapsed, AddressOf timer_Elapsed
       End Sub
    
       Friend Sub Start()
          previousRun = DateTime.Today
          Dim timeSpanToMidnight As TimeSpan = GetNextMidnight().Subtract(DateTime.Now)
          timer.Interval = timeSpanToMidnight.TotalMilliseconds
          timer.Start()
       End Sub
    
       Private Sub timer_Elapsed(ByVal sender As Object, ByVal e As ElapsedEventArgs)
          If previousRun <> DateTime.Today Then RaiseEvent Elapsed(Me, EventArgs.Empty)
          timer.[Stop]()
          Start()
       End Sub
    
       Private Sub SystemEvents_TimeChanged(ByVal sender As Object, ByVal e As EventArgs)
          timer.[Stop]()
          Start()
       End Sub
    
       Private Shared Function GetNextMidnight() As DateTime
          Return DateTime.Today.AddDays(1)
       End Function
    End Class
    classe program.vb (nessun problema)
    codice:
    Imports System.ServiceProcess
    
    Namespace ScanEventLogService
       Module Program
          Private Sub Main()
             Dim ServicesToRun As ServiceBase()
             ServicesToRun = New ServiceBase() {New EventLogService()}
             ServiceBase.Run(ServicesToRun)
          End Sub
       End Module
    End Namespace

    Il problema ce l'ho nel servizio, non so bene perchè ma ho evidenziato le due istruzioni che VS mi segna come errore
    EventLogService.vb
    codice:
    Imports System
    Imports System.Collections.Generic
    Imports System.ComponentModel
    Imports System.Data
    Imports System.Diagnostics
    Imports System.Linq
    Imports System.ServiceProcess
    Imports System.Text
    Imports System.Threading.Tasks
    Imports System.Timers
    Imports System.Windows.Threading
    Imports System.Configuration
    Imports System.IO
    Imports System.Net.Mail
    Imports System.Net
    
    Namespace ScanEventLogService
       Partial Public Class EventLogService
          Inherits ServiceBase
    
          Private timer As Timer
    
          Public Sub New()
             InitializeComponent()
          End Sub
    
          Protected Overrides Sub OnStart(ByVal args As String())
             Dim UomoInFrack As MidnightTimer = New MidnightTimer()
             UomoInFrack.Elapsed += Function(s, e) OnTimer()
             UomoInFrack.Start()
          End Sub
    
          Public Sub OnTimer()
             Try
                'codice da eseguire
    
             Catch ex As Exception
             End Try
          End Sub
    
          Protected Overrides Sub OnStop()
             'altro codice da eseguire
          End Sub
       End Class
    End Namespace
    Initializecomponent() non so pproprio...
    Uomoinfrack.elapsed sembra non possa essere chiamato in quel modo, dovrei usare un raisevent ma non accetta poi la chiamata del metodo...
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  3. #23
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,886
    inizia a fare lo scheletro di un Windows Service da visual studio, vedrai il progetto gia' impostato e sara' piu' facile collegare.

    uomoinfrack e' l'istanza di MidnightTimer, la classe che controlla ogni mezzanotte semplicemente, che chiama OnTimer dove c'e' il codice da eseguire...

    fai un nuovo servizio con VS, vedrai che ti mette gia' tutte le classi e sara' piu' facile rimpiazzare.

    se hai problemi fai sapere

  4. #24
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,857
    Fatto, ma crea un service1.vb (codice e progettazione) e basta...
    Nel codice abbozza questo
    codice:
    Public Class Service1
    
       Protected Overrides Sub OnStart(ByVal args() As String)
          ' Inserire qui il codice necessario per avviare il proprio servizio. Il metodo deve effettuare
          ' le impostazioni necessarie per il funzionamento del servizio.
       End Sub
    
       Protected Overrides Sub OnStop()
          ' Inserire qui il codice delle procedure di chiusura necessarie per arrestare il proprio servizio.
       End Sub
    
    End Class
    e quindi qui andrà...Midnighttimer? Mentre il resto?

    Abbiate pazienza, sono di legno...
    Ultima modifica di supermac; 18-07-2020 a 18:05
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  5. #25
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,886
    uhm...mi sa che stai confondendo la classe lanciata dal servizio con quella Program.


    Program deve avere solo il Main con il servizio da far partire.
    come scritto, è l'entry point di tutto.

    codice:
    static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            static void Main()
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[]
                {
                    new EventLogService()
                };
    
    
                ServiceBase.Run(ServicesToRun);
            }
        }

    EventLogService() = la tua Service1, classe dotata di OnStart ed OnStop e che a sua volta usa MidnightTimer che puo' stare dove vuoi nella solution.


    Ti manca l'entry point, Program.vb....possibile che visual studio non lo crei ?
    Ultima modifica di djciko; 19-07-2020 a 21:35

  6. #26
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,857
    Suppongo che l'entry point lo chiami service1.vb....
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  7. #27
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,886
    si. Inoltre mi sa che VB e C# generano template diversi...

  8. #28
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    chi lavora in vb.net deve conoscere c#
    Pietro

  9. #29
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,521
    Ciao
    Personalmente non trovo grandi differenze sulla questione c# vb.net per la creazione dei windows service, ma magari sta solo nel modo di farlo che ho io
    Comunque una volta creato il servizio io in genere aggiungo il programma di installazione (selezionando il servizio e cliccando con il destro del mouse nella finestra del servizio e poi ->aggiungi programma d'installazione), una volta nelle proprietà del programma d'installazione è possibile configurare il servizio con i permessi necessari e il tipo di avvio.
    Una volta compilato basta eseguire lo strumento InstallUtil.exe (presente nella cartella del net framework, tipo C:\Windows\Microsoft.NET\Framework\v4.0.30319) indicando il file exe. Tipo :
    codice:
    InstallUtil.exe c:\MyService.exe (installa)
    InstallUtil.exe u/ c:\MyService.exe (disinstalla)
    fatto questo il servizio dovrebbe essere presente nell'elenco dei servizi.

    EDIT:
    Ovviamente tutto il codice deve essere gestito all'interno del servizio che tramite override segnala i vari eventi (tipo OnStart; OnStop; OnPause; OnContinue; OnShutdown ecc.).
    Poi a te la scelta se eseguire il codice della pagina portandolo dentro al windows service oppure mettere dentro una chiamata alla tua pagina.

    EDIT 2:
    Questo è il contenuto del programma d'installazione :
    codice:
    Imports System.ComponentModel
    Imports System.Configuration.Install
    
    
    Public Class ProjectInstaller
    
    
        Public Sub New()
            MyBase.New()
    
    
            'Chiamata richiesta da Progettazione componenti.
            InitializeComponent()
    
    
            'Aggiungere il codice di inizializzazione dopo la chiamata a InitializeComponent
    
    
        End Sub
    
    
    End Class
    Ultima modifica di U235; 21-07-2020 a 17:46

  10. #30

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.