Hoi dames en heren van het (hopelijk) goeie leven!
Al geruime tijd ben ik bezig met mezelf te leren programmeren, en dat gaat me over het algemeen vrij aardig af. Alleen loop ik nu tegen een probleem op waar ik even geen antwoord op weet.
Gebaseerd op het artikel van RDavey heb ik mooi werkende Asynchrone TCP server (en clients).
Nu wil ik hier een logging systeem aan toevoegen. Omdat de server nooit mag "blocken" dacht ik, mooi, kan ik mooi eens uitzoeken hoe ik zelf asynchrone taken kan maken. (Geen kaas van gegeten.)
Ik heb dus een paar classes:
Ik heb de Asynchrone functie gebaseerd op dit artikel
De code thus far:
Daadwerkelijke functie:
De Async functie, deze gooit af en toe de "Busy" exception
[
Async functie, met een poging tot wacht systeempje:
De callback:
Hopelijk kan er iemand antwoord geven op mijn vragen:
[no-homo]
LIEFDE
[/no-homo]
verwachten
thnx! Sander
Al geruime tijd ben ik bezig met mezelf te leren programmeren, en dat gaat me over het algemeen vrij aardig af. Alleen loop ik nu tegen een probleem op waar ik even geen antwoord op weet.
Gebaseerd op het artikel van RDavey heb ik mooi werkende Asynchrone TCP server (en clients).
Nu wil ik hier een logging systeem aan toevoegen. Omdat de server nooit mag "blocken" dacht ik, mooi, kan ik mooi eens uitzoeken hoe ik zelf asynchrone taken kan maken. (Geen kaas van gegeten.)
Ik heb dus een paar classes:
- Server
- LogEngine
- Log (bevat alleen een DateTime en een string)
Ik heb de Asynchrone functie gebaseerd op dit artikel
De code thus far:
Daadwerkelijke functie:
C#:
1
2
3
4
5
6
7
8
| private void AddLogEntry(Log l) { lock (this.logList) { logList.Add(l); } nrLogEntries++; } |
De Async functie, deze gooit af en toe de "Busy" exception
[
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public void AddLogEntryAsync(Log l) { AddLogEntryDelegate logger = new AddLogEntryDelegate(AddLogEntry); AsyncCallback AddEntryCallback = new AsyncCallback(AddLogEntryCallback); lock (_sync) { if (_AddLogEntryIsRunning) { throw new InvalidOperationException("Busy..."); } AsyncOperation async = AsyncOperationManager.CreateOperation(null); logger.BeginInvoke(l, AddEntryCallback, async); _AddLogEntryIsRunning = true; } } |
Async functie, met een poging tot wacht systeempje:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| public void AddLogEntryAsync(Log l) { AddLogEntryDelegate logger = new AddLogEntryDelegate(AddLogEntry); AsyncCallback AddEntryCallback = new AsyncCallback(AddLogEntryCallback); lock (_sync) { if (_AddLogEntryIsRunning) { //throw new InvalidOperationException("Busy..."); while(_AddLogEntryIsRunning) { System.Threading.Thread.Sleep(1); } } AsyncOperation async = AsyncOperationManager.CreateOperation(null); logger.BeginInvoke(l, AddEntryCallback, async); _AddLogEntryIsRunning = true; } } |
De callback:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| private void AddLogEntryCallback(IAsyncResult ar) { //get the original logger delegate ans the AsyncOperation instance AddLogEntryDelegate logger = (AddLogEntryDelegate)((AsyncResult)ar).AsyncDelegate; AsyncOperation async = (AsyncOperation)ar.AsyncState; //finish asynchronous operation logger.EndInvoke(ar); //clear running flag: lock (_sync) { _AddLogEntryIsRunning = false; } AsyncCompletedEventArgs completedArgs = new AsyncCompletedEventArgs(null, false, null); async.PostOperationCompleted(delegate(object e) { OnAddEntryCompleted((AsyncCompletedEventArgs)e); }, completedArgs); } |
Hopelijk kan er iemand antwoord geven op mijn vragen:
- Klopt mijn conclusie dat als de "busy" exception gegooid wordt het dus zo is dat er een nieuwe call naar de asynchrone functie gemaakt wordt terwijl er nog eentje loopt en niet klaar is?
- Klopt het dat er nooit 2 tegelijk mogen lopen, immers, er kan maar een functie call tegelijk een List<> bewerken?
- Is het wel handig om een dergelijk systeem met asynchrone functies te bouwen? zijn er betere alternatieven?
- Mocht ik hier wel op het juiste spoor zitten, hoe kan ik ervoor zorgen dat de volgende log-actie pas uitgevoerd wordt indien de vorige klaar is?
[no-homo]
LIEFDE
[/no-homo]
verwachten
thnx! Sander
edit:
hoofdletters
hoofdletters