Ho un app che ha a che fare il seguente tipo di cose, preferibilmente sul filo GUI in quanto è lì che la maggior parte dell'azione è in atto e non ci sono ops a lungo in esecuzione:Come si avvia una sequenza temporale di eventi sul thread della GUI in C#?
Wait 1000
FuncA()
Wait 2000
FuncB()
Wait 1000
FuncC()
mi rendo conto potrei usare un timer con una funzione onTick state stile macchina, ma che sembra ingombrante:
int _state;
void OnTick(object sender, EventArgs e) {
switch (_state) {
case 0:
FuncA();
_timer.Interval = TimeSpan.FromSeconds(2);
_state = 1;
break;
case 1:
FuncB();
_timer.Interval = TimeSpan.FromSeconds(1);
_state = 2;
break;
case 2:
FuncC();
_timer.IsEnabled = false;
_state = 0;
}
}
Inoltre mi piacerebbe essere in grado di rendere sufficientemente generico per fare qualcosa di simile
RunSequenceOnGuiThread(new Sequence {
{1000, FuncA}
{2000, FuncB}
{1000, FuncC}};
Esiste un modo idiomatico per fare questo genere di cose? Dato tutto il materiale di TPL, o Rx, o anche le espressioni di calcolo in F #, suppongo che ne esista uno, ma non lo trovo.
Cosa GUI stai usando? Winforms, WPF o qualcos'altro? – svick
WPF per ora, ma mi piacerebbe una soluzione (o almeno una tecnica) che funzionasse anche su WinForms. – lobsterism
Sidebar: una modifica che apporterei - attraverso tutte le soluzioni suggerite - consiste nell'utilizzare TimeSpan anziché integer per il ritardo. 1000 potrebbe significare un secondo, 1000 secondi, ecc. TimeSpan è intrinsecamente chiaro e non ambiguo. –