[c#]Werken met een timer of een thread?

Pagina: 1
Acties:

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 12:56
Een applicatie die ik ga maken moet het volgende doen:

Op een gezette interval (tussen de 5 en 60 minuten) moet deze applicatie een webservice aanroepen. Deze webservice haalt een XmlDocument over en slaat deze op.

Verder zijn er nog wat optionele voorwaardes (maximaal 2400 items downloaden, laatste download moet om 14:00 per werkdag zijn etc. etc.). Deze applicatie zal in eerste instantie de gehele dag draaien.

Als laatste (wat het volgens mij wat ingewikkelder maakt als je met aparte threads wil gaan werken) zullen een aantal items in de GUI geupdate worden.

Het update in de gui doe ik (volgens mij een best practice) met delegates en events.

Nu heb ik het e.e.a. gelezen met threads waaronder deze, volgens mij goede, tutorial.
Vervolgens nog even rondgevraagd en iemand zei tegen mij: Waarom werk je niet met een timer? Dat is in principe ook een aparte thread, los van de GUI.

Ik ben wat betreft Windows.Forms e.d. een leek dus gaat het ook om het niveau (en een timer lijkt mij het makkelijkst.)

Dus concreet de vraag: Kan ik beter de Timer gebruiken, of ga ik me baseren op de code welke in bovenstaande tutorial te vinden is, dus zelf de Threads aanmaken?

Nb.: Ik heb al een simpele test met een Timer, delegates en events e.d. gemaakt, alleen zou ik dus willen weten of dit de goede manier is.

[ Voor 9% gewijzigd door TeeDee op 31-05-2006 15:15 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • whoami
  • Registratie: December 2000
  • Laatst online: 20-02 21:53
Als je iedere keer, op een gezet interval een bepaalde actie wil uitvoeren, dan kan je dat best met een timer doen. In de event die getriggered wordt als je timer afgaat, zorg je erdan voor dat die taak uitgevoerd wordt.
Indien het een taak betreft die lang kan duren, kan je die taak ook nog eens op een aparte thread uitvoeren.

https://fgheysels.github.io/


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 12:56
whoami schreef op woensdag 31 mei 2006 @ 15:17:
Als je iedere keer, op een gezet interval een bepaalde actie wil uitvoeren, dan kan je dat best met een timer doen. In de event die getriggered wordt als je timer afgaat, zorg je erdan voor dat die taak uitgevoerd wordt.
Indien het een taak betreft die lang kan duren, kan je die taak ook nog eens op een aparte thread uitvoeren.
Kijk, dan zat ik toch redelijk in de goede richting. In hoeverre moet je 'lang kan duren' definieren? 1 dag? Het is niet zo dat het een super robuuste applicatie moet worden. Mocht deze crashen, dan hoeft een herstart daarvan geen problemen opleveren.

De taak is dus in dit geval het overhalen van XmlDocumenten van +/- 1 Kb, vervolgens worden deze geparsed en in een db gestopt (of in een plaintext weggeschreven)*

Die zou dus weer in een aparte thread voor de zekerheid gestopt kunnen worden. Wil ik dus 'meldingen' uit die taak doorgeven op de GUI, dan zal ik me moeten baseren op de code van die tutorial (dus met invoke e.d.)?

* Het wegschrijven e.d. zou natuurlijk ook nog in een andere method gedaan kunnen worden. Bijvoorbeeld zodra de 2400 items gehaald zijn, om 14:00 uur of een handmatige actie.

Op deze manier haal je volgens mij evt. problemen met het te lang duren van een download, parse en insert naar een iets meer gecontroleerde methode.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • whoami
  • Registratie: December 2000
  • Laatst online: 20-02 21:53
Lang duren: zodanig lang dat je UI niet meer responsief is, en de gebruiker de indruk krijgt dat je applicatie 'geblokkeerd' is.
(Zie ook één van die 2 'golden rules' in die threading tutorial die je aanhaalde).

https://fgheysels.github.io/


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 12:56
whoami schreef op woensdag 31 mei 2006 @ 15:29:
Lang duren: zodanig lang dat je UI niet meer responsief is, en de gebruiker de indruk krijgt dat je applicatie 'geblokkeerd' is.
(Zie ook één van die 2 'golden rules' in die threading tutorial die je aanhaalde).
Okay.

Zoiets zou ik (tijdelijk) kunnen oplossen dat de gebruiker eerst op 'STOP' drukt, vervolgens evt. handmatige acties uitvoert.

In ieder geval weer bedankt.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 14-02 12:54
whoami schreef op woensdag 31 mei 2006 @ 15:17:
Als je iedere keer, op een gezet interval een bepaalde actie wil uitvoeren, dan kan je dat best met een timer doen. In de event die getriggered wordt als je timer afgaat, zorg je erdan voor dat die taak uitgevoerd wordt.
Indien het een taak betreft die lang kan duren, kan je die taak ook nog eens op een aparte thread uitvoeren.
Blokkeert de GUI dan ook bij het uitvoeren van een Timer?

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • whoami
  • Registratie: December 2000
  • Laatst online: 20-02 21:53
Dat dacht ik wel ja.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 19-02 14:18

pjvandesande

GC.Collect(head);

Jip, blockeerd je UI Thread. Niks aan te doen. Overigens gebruik ik voor een soorgelijke actie geen timer maar een Thread. Werkt prima en nergens problemen mee. Ik vind het overkill om elke timer tick een thread te starten. Zeker omdat je waarschijnlijk niet wilt dat er twee thread tegelijk lopen mocht de volgende timer tick eerder zijn dan het einde van je thread die nog loopt.

Daarom zou ik juist voor een Thread kiezen.

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 14-02 12:54
Als het uitvoeren van de actie een fractie van een seconde duurt is er volgens mij niks op tegen om het in een Timer te doen. Daar zijn die dingen tenslotte ook voor bedoeld.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1