Dag allemaal,
Ik sit vast met een hoe het correct beeindigen van een thread, meerbepaald 2 theads.
Ik hoop dat dit duidelijk is:
-2 theads die gebruikmaken van éénzelfde object om een stuk code te locken
-bijde threads hebben een AutoResetEvent
-bij de aanvraag van het stuiten van de applicatie roep ik AutoResetEvent.Set voor de twee threads
Bij dit laatse puntje is het probleem, roep ik deze 2 Set methodes op dan zal de code in de thread niet meer runnen (zie while loop in code) maar hiermee zijn de threads nog niet beeindigd en ik heb ook opgemerkt dat dat één van de 2 thead of beiden nog bezig kunnen zijn met het verwerken van data na ik de Set method op opgeroepen. Moet ik nu abort, join opreopen na de Set of moet het anders.
Een stuk code ter verduidelijking :
Ik sit vast met een hoe het correct beeindigen van een thread, meerbepaald 2 theads.
Ik hoop dat dit duidelijk is:
-2 theads die gebruikmaken van éénzelfde object om een stuk code te locken
-bijde threads hebben een AutoResetEvent
-bij de aanvraag van het stuiten van de applicatie roep ik AutoResetEvent.Set voor de twee threads
Bij dit laatse puntje is het probleem, roep ik deze 2 Set methodes op dan zal de code in de thread niet meer runnen (zie while loop in code) maar hiermee zijn de threads nog niet beeindigd en ik heb ook opgemerkt dat dat één van de 2 thead of beiden nog bezig kunnen zijn met het verwerken van data na ik de Set method op opgeroepen. Moet ik nu abort, join opreopen na de Set of moet het anders.
Een stuk code ter verduidelijking :
C#: geen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| private static object _OLock = new object(); private static AutoResetEvent threadWait = new AutoResetEvent(false); private static AutoResetEvent threadWaitCleanup = new AutoResetEvent(false); private static void DoWork() { bool mainLoop = true; while (mainLoop && !threadWait.WaitOne(Config.SleepTimeFtpThread)) { Console.Write("."); lock (_OLock) {....} } } private static void CleanUp() { bool mainLoop = true; while (mainLoop && !threadWaitCleanup.WaitOne(Config.SleepTimeCleanupThread)) { Console.Write("."); lock (_OLock) {...} } } public static void StopThreads() { Console.WriteLine("\r\nStopping all threads..."); /* Stopping DoWork */ threadWait.Set(); /* Stopping CleanUp */ threadWaitCleanup.Set(); Console.WriteLine("Threads stopped."); Console.WriteLine("Its safe to close application."); } |