Quindi, ho un interessante problema di progettazione e onestamente non so come affrontarlo. Ho un'applicazione che verrà eseguita su una dozzina di workstation. Di quelle postazioni di lavoro, è impossibile sapere in qualsiasi momento quanti di loro saranno o utilizzeranno la mia applicazione. Ogni 4 ore di ora locale se una qualsiasi delle applicazioni è attiva, controllano il database e apportano alcune modifiche. Il problema è che se più di uno cerca di farlo, ci saranno alcune importanti complicazioni. Quindi ho bisogno di un modo per una sola applicazione per eseguire gli aggiornamenti se ne sono in esecuzione più di uno.
Stavo pensando di creare un file che risiedesse nell'unità di rete in cui le applicazioni avrebbero aggiunto i loro indirizzi di workstation mentre venivano accesi e rimossi mentre venivano disattivati. Ogni 4 ore di ora locale, le applicazioni controllerebbero il file e chiunque fosse in cima sarebbe l'unico a eseguire l'aggiornamento. Il problema è che se un'applicazione viene chiusa nel modo in cui non può rimuovere se stessa dalla cima dell'elenco, non apparirà nessun aggiornamento da lì.
Non ho un'opzione per far funzionare le applicazioni sul server stesso, oltre alla memorizzazione dei file lì, quindi è fuori questione. Qualcuno sa di una soluzione a questo problema? Non riesco a spiegarmelo.
Modifica: ciò che ho implementato adesso è questo:
int updateTimerOffset = (Convert.ToInt32(DateTime.Now.ToString("mm")) * 60000) - 120000;
updateTimer = new System.Timers.Timer(3600000 - updateTimerOffset);
updateTimer.AutoReset = true;
updateTimer.Enabled = true;
updateTimer.Elapsed += new System.Timers.ElapsedEventHandler(PerformUpdates);
e poi giù nel mio PerformUpdates ho un codice che assomiglia a questo:
int currentHr = Convert.ToInt32(DateTime.Now.ToString("HH"));
if (currentHr % 4 >= 0 && currentHr >= fileNum)
{
// change fileNum in the file to currentHr + 4 if currentHr is not 24,
// if it is, then make the value equal to 4
// Update database stuff
}
fileNum è un numero memorizzato in un file sul server.
Questo viene fatto all'avvio di ogni applicazione. Quindi, ogni applicazione, a meno che non sia stata avviata esattamente nello stesso esatto secondo, avrà una differenza di 2 minuti (120.000 millisecondi) più alcuni secondi che non ho tenuto conto tra i loro avviamenti.
Quello che posso fare è avere un semplice file contenente un numero per l'ora di destinazione (fileNum). In modo che quando l'applicazione lo controlla, guarda il numero per fare il confronto.
Quindi diciamo che sono le 16:00, nel qual caso il 16% 4 ci dà 0 ed è ora di un aggiornamento. Quell'applicazione controlla il file e vede che il valore è 12. 16 è uguale o maggiore di 12. Quindi cambia il valore nell'ora corrente (16) + 4, che è 20.
Il timer dell'applicazione successiva trascorre circa un minuto dopo, e ha 0 per il suo valore mod orario. Quindi, guarda il file e vede che il valore è 20, che è maggiore di 16, quindi non fa nulla.
Cosa ne pensate di questa soluzione? Non funzionerebbe se ci fossero centinaia di workstation, dal momento che le possibilità che entrambe le applicazioni provassero a farlo allo stesso tempo sono più alte, ma con una dozzina di workstation posso farcela? A meno che qualcuno non abbia una soluzione migliore?