Come posso generare un evento in un momento specifico? Ad esempio, supponiamo di voler generare un avviso alle 8:00 AM che mi informi delle sue 8:00 (o di un evento che mi informa dell'ora corrente in un dato momento).Come posso generare un avviso in un momento specifico in C#?
risposta
utilizzare la classe System.Threading.Timer:
var dt = ... // next 8:00 AM from now
var timer = new Timer(callback, null, dt - DateTime.Now, TimeSpan.FromHours(24));
Il callback
delegato sarà chiamato la prossima volta è 08:00 e ogni 24 ore successive.
Vedere this SO question come calcolare l'occorrenza successiva alle 8:00.
private void Run_Timer()
{
DateTime tday = new DateTime();
tday = DateTime.Today;
TimeSpan Start_Time = new TimeSpan(8,15,0);
DateTime Starter = tday + Start_Time;
Start_Time = new TimeSpan(20, 15, 0);
DateTime Ender = tday + Start_Time;
for (int i = 0; i <= 23; i++)
{
Start_Time = new TimeSpan(i, 15, 0);
tday += Start_Time;
if (((tday - DateTime.Now).TotalMilliseconds > 0) && (tday >= Starter) && (tday <= Ender))
{
Time_To_Look = tday;
timer1.Interval = Convert.ToInt32((tday - DateTime.Now).TotalMilliseconds);
timer1.Start();
MessageBox.Show(Time_To_Look.ToString());
break;
}
}
}
Possiamo usare questa funzione per ottenere il timer in esecuzione per i tempi o modificarlo per l'esecuzione su un orario specifico: D
È ovvio che la soluzione di @dtb è migliore. – albertein
Ma è anche ovvio che non hai avuto l'idea che una persona che pone la domanda riesca a capire meglio la sua domanda. Sono d'accordo che mi ha dato un formato per farlo in una specifica ora del giorno, ma ho dovuto farlo funzionare su le condizioni non staticamente in una certa ora del giorno una volta la maggior parte del lavoro fatto nel mio codice è per l'esecuzione di quel ciclo e impostare il tempo per il prossimo arresto del timer. Se si può vedere che non il numero di linee in quel – Mobin
Does l'avviso devono essere generati dal programma? Un approccio alternativo consiste nell'utilizzare un Scheduled Task (in Windows) per generare l'avviso. Potrebbe essere necessario scrivere un piccolo programma che raccoglie tutte le informazioni da file di dati della vostra applicazione principale ecc
ci sono un paio di vantaggi principali di utilizzare questo approccio:
- Non è necessario scrivere alcun codice per supportare la funzionalità. Fai uso di qualcosa integrato nel sistema operativo. L'esempio è per Windows, ma altri sistemi operativi hanno la stessa funzionalità. È possibile concentrare lo sviluppo e supportare lo sforzo sul proprio codice.
- L'applicazione principale non deve essere in esecuzione per l'attività da attivare.
Elaborando la risposta di dtb questo è il modo in cui l'ho implementato.
private void Form1_Load(object sender, EventArgs e)
{
System.Threading.TimerCallback callback = new TimerCallback(ProcessTimerEvent);
//first occurrence at
var dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 10, 0, 0);
if (DateTime.Now < dt)
{
var timer = new System.Threading.Timer(callback, null,
//other occurrences every 24 hours
dt - DateTime.Now, TimeSpan.FromHours(24));
}
}
private void ProcessTimerEvent(object obj)
{
MessageBox.Show("Hi Its Time");
}
So che seguendo il link ne parla, ma potrebbe voler chiarire che questo è System.Threading.Timer e non System.Windows.Forms.Timer – McAden
funzionerebbe se fornisco l'ultimo 8.00 da oggi? Quindi viene dato un numero negativo? – Jaanus
@Jaanus No, l'ho appena provato e lancia un'eccezione. Se dt