Παναγιώτη σε ευχαριστώ για την απάντηση αλλά στην προσπάθειά μου να μην μακρυγορήσω παράλλαξα κάπως αυτό που πραγματικά κάνω.
Εξακολουθώ να έχω πρόβλημα.
Βασικά, προσπαθώ να προσομοιώσω αισθητήρες. Κάθε αισθητήρας συνδέεται με έναν κεντρικό κόμβο(Intermediate).
Δίνω το δικαίωμα και οι Intermediates να συνδέονται με έναν το πολύ Intermediate (Δέντρο με ένα ή δύο επίπεδα και φύλα τους κόμβους).
Εικονικά, στον κεντρικό βρίσκεται η ΒΔ και σε τακτά χρονικά δεδομένα στέλνουν εκεί τα δεδομένα τους οι αισθητήρες. Για κάθε αισθητήρα έχω ένα table.
Έχω υλοποιήσει τους κεντρικούς κόμβους σαν Backgroundworkers οι οποίοι δημιουργούν τους Sensors του group τους σαν Backgroundworkers επίσης.
Κάθε intermediate έχει μια λίστα με κάθε Sensor που έχει δημιουργήσει και ανήκει στο Group του.
Επίσης έχει και λίστα με του Intermediates που μπορεί να είναι συνδεδεμένοι με αυτόν
Η συνολικά δουλεύει σωστά.
Το πρόβλημα είναι όταν θέλω να τους σκοτώσω:
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 | public void Terminate() { //Σκότωσε τους Intermeditates σου foreach (KeyValuePair<string, Intermediate> interPair in IntermediateList) interPair.Value.Terminate();
//Σκότωσε τους Sensors σου foreach (KeyValuePair<string, Sensor> sensorPair in SensorList) { sensorPair.Value.Terminate(); }
while (true)//Περιμένουμε μέχρι να πεθάνουν όλοι οι sensors { int liveCount = 0; for (int i = 0; i < SensorList.Values.Count; ++i) { if (SensorList.Values[ i ] .IsBusy) ++liveCount; }
if (liveCount == 0) break; else Thread.Sleep(100);//Kοιμήσου λίγο και ξανάδοκίμασε }
SensorList.Clear(); TerminateLoop = true;//Εδώ τελειώνει το loop του Intermediate } |
Οι Sensor Και Intermediate κάνουν inherit την BackgroundWorker
H Terminate απλά κάνει true μια μεταβλητή και σπάει ένα while loop που τρέχει στη Work function του Sensor
Στην Γραμμή 18 Δεν καταφέρνω ποτέ να πάρω False.
Στον debugger φαίνεται ποτέ να μην εκτελείται το event OnRunWorkerCompleted παρόλο που το event OnDoWork δείχνει να τερματίζει κανονικά.
Γιατί συμβαίνει αυτό.
Αν πάλι αφαιρέσω τον κώδικα όπου περιμένω να τερματίσουν οι BW, στο Performance monitor δεν φαίνεται να πεθαίνουν τα threads που δημιουργήθηκαν.
Παρόλο που σταματούν οι ενημερώσεις της ΒΔ.