ciao
intanto grazie per la risposta.
Avevo pensato alla tua soluzione ma volevo evitare di fare una query al minuto sul db perciò ho cercato strade alternative.
Effettivamente neppure quella di avere in memoria migliaia di Timer è una
'Furbata' :)
Pensandoci sono arrivato a qeusta soluzione
public sealed class AlarmsManager:IDisposable
{
//Intervallo lettura default 1min
int interval = 60000;
Timer timer = null;
private static Dictionary<int, DateTime> inCorsoItems = null;
private static Dictionary<int, DateTime> chiusiItems = null;
static readonly AlarmsManager _instance = new AlarmsManager();
public static AlarmsManager Instance
{
get
{
return _instance;
}
}
private AlarmsManager()
{
if (ConfigurationManager.AppSettings["AlarmsManagerInterval"] != null)
interval = Convert.ToInt32(ConfigurationManager.AppSettings["AlarmsManagerInterval"]);
inCorsoItems = new Dictionary<int, DateTime>();
chiusiItems = new Dictionary<int, DateTime>();
if (!IsConfiguredFromXml())
Start();
}
public void AddNewInCorso(int astaID, DateTime scadenza)
{
inCorsoItems.Add(astaID, scadenza);
}
private void Start()
{
timer = new Timer(interval);
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Enabled = true;
}
public void StopAndWriteObserved()
{
//Scrivo su un file xml tutte le aste in sospeso
//mi serve in caso Application_Stop
}
public bool IsConfiguredFromXml()
{
//Leggo il file xml e reimposto tutte le scadenza
//se trovo aste scadute Update
//Problema potrebbe passare troppo tempo e la chiusura avverrebbe con un ritardo
return false;
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
var changedList = from item in inCorsoItems
where item.Value <= DateTime.Now
select item;
var daCancellare = from todel in chiusiItems
where todel.Value <= DateTime.Now
select todel;
foreach (var item in changedList)
{
AstaManager astaManager = new AstaManager();
astaManager.UpdateStato(item.Key);
chiusiItems.Add(item.Key, DateTime.Now.AddDays(1));
inCorsoItems.Remove(item.Key);
}
foreach (var todel in daCancellare)
{
AstaManager astaManager = new AstaManager();
astaManager.CancellaAsta(todel.Key);
chiusiItems.Remove(todel.Key);
}
}
#region IDisposable Membri di
public void Dispose()
{
StopAndWriteObserved();
}
#endregion
}
L'unico problema è il tempo che potrebbe trascorrere tra lo shutdown dell'App ed il restart.
Accetto suggerimenti sulla soluzione.
Michele