Toon posts:

[C#] Threads en synchrone uitvoer

Pagina: 1
Acties:

Verwijderd

Topicstarter
Stel je voor:

Ik heb een systeem waarbij clients een proces starten op een server. Dat kan wel 10.000 keer per seconde gebeuren, terwijl het een paar momenten later een stuk rustiger is en slechts 1 maal per 10 seconde een proces wordt gestart.

Dit proces bestaat uit een aantal stappen, bijvoorbeeld:

- Schrijf 'start proces' naar bestand;
- Ontvang bericht;
- Controleer bericht;
- Stuur bericht naar ontvangers;

Iedere keer als het proces wordt gestart wil ik dit dus in een tekstfile laten wegschrijven.

Het afhandelen van het proces gaat synchroon, dus er kunnen meerdere processen tegelijk bezig zijn.

Probleem is dat op een gegeven moment, omdat het zo snel kan gaan, proces 43.573 in het bestand wil gaan schrijven terwijl proces 43.572 nog bezig is met het bestand.

Nou heb ik twee oplossingen:

- lock het bestand, zodat andere processen wachten tot het vrij is
- plaats de opdracht tot schrijven in een queue die 1 voor 1 geleegd wordt.

Nou heb ik eens gekeken naar de Threadpool class, maar deze voert volgens mij de threads daarin nog steeds asynchroon uit, waardoor ik nog steed met locking zit.

Ik kan ook zelf een queue maken, waarbij een snelle timer iedere zoveel miliseconden kijkt of er nieuwe items zijn, en ze dus 1 voor 1 afhandelt. Maar goed, is het zinvol om hier zelf iets vor te maken, of moet ik nog even doorzoeken en is er al zoiets standaard in .Net aanwezig?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Waarom laat je niet alle threads het bericht in een 'command' queue zetten en een andere thread laten wachten slapen op deze command queue (jouw 2e oplossing dus). Deze thread gaat zo gauw er een bericht is de file openen en de wijzigingen daarin wegschrijven. Hij kan zelfs een hele batch met getallen wegschrijven zonder iedere keer te openen en closen.

De andere threads kunnen dan hun werk doen zonder te wachten op het vrijkomen van de file. Ik neem aan de het wegschrijven naar de file een asynchrone operatie is: post and forget. En dat er geen consequenties zijn voor een thread als het bericht nog niet is weggeschreven.

[edit]
Ik zou trouwens altijd gebruik maken van Threadpools.. Ongecontroleerd threads aanmaken is vragen om problemen imho. Met een threadpool heb je beter onder controle hoeveel threads er maximaal draaien.

[edit2]
Als je trouwens werkt met een boundedqueue kan je verhinderen dat er niet te veel commands in die queue komen te staan. Zo gauw hij vol is, worden puts geblokkeerd zo lang hij vol is. Zo gauw er weer plek kan weer verder gegaan worden met het plaatsen van berichten. Dit kan in sommige situaties handig zijn om te verhinderen dat je queue zo`n lading werk krijgt die hij niet meer kan verwerken.

[ Voor 62% gewijzigd door Alarmnummer op 14-07-2005 12:46 ]