Salve,
so che è un argomento già trattato diverse volte, ma leggendo gli altri thread non sono risucito a venirne a capo.
In questa classe presa da Aspitalia per effettuare le operazioni pianificate tramite asp.net ho messo una classe creata da me:
codice:
using System;
using System.Timers;
using System.Web;
using MyStats;
public class MyGlobal:HttpApplication
{
private Timer OpTimer;
//orario stabilito della prima operazione
//e per le successive (calcolato automaticamente)
public static DateTime When;
//riesegui ogni n ore
public static byte Every;
public MyGlobal():base()
{
//orario stabilito della prima operazione
//non indicare la data in previsione di futuri riavvi di iis
When=DateTime.Parse("22:53");
//riesegui ogni n ore
Every=24;
StartTimer();
}
public void OnTimedEvent(object source, ElapsedEventArgs e)
{
//Richiamo classe da me creata
try
{
Stats hit=new Stats();
hit.Analyze();
Application["debug"]="ok";
}
catch (System.Exception ex){
Application["debug"]=ex;
}
//riimposto il timer per portarlo avanti di n ore
When=When.AddHours(Every);
//riprendo l'intervallo cos prendo in considerazione il tempo di elaborazione passato
//con il tempo potrebbe sballare
OpTimer.Interval=GetInterval();
OpTimer.Start();
}
private double GetInterval()
{
TimeSpan diff=When.Subtract(DateTime.Now);
//risultato in millisecondi
return diff.Ticks / 10000;
}
private void StartTimer()
{
//se l'ora in cui deve partire è più piccola di oggi (visto che la parserizza con la data odierna)
//lo portiamo alla prossima esecuzione
if (When<DateTime.Now) {
//aumento la data dell'operazione dell'intervallo dato
//fino a quando è maggiorne dell'ora odierna
while (When<=DateTime.Now){
When=When.AddHours(Every);
}
}
OpTimer=new Timer(GetInterval());
OpTimer.AutoReset=false;
OpTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
OpTimer.Enabled=true;
}
}
Però se controllo la variabile Application["debug"] dopo l'esecuzione pianificata ottengo l'errore
System.NullReferenceException: Riferimento a un oggetto non impostato su un'istanza di oggetto. at MyStats.Stats.Analyze() at MyGlobal.OnTimedEvent(Object source, ElapsedEventArgs e)
Io lavoro prevalentemente in vb.net e non utilizzo VS.net.
Mi sapete dire come devo istanziare la chiamata alla classe da me creata?
Grazie