Γειά χαρά,
Σε κάποιο application που αναπτύσσω με Visual Basic 2008, χρειάζομαι να
γεμίσω ένα listbox/combobox/treeview (κ τα 3 με καλύπτουν, η επιλογή
δεν έχει σημασία) με 5000+ αντικείμενα. Εκτός του ότι η διαδικασία
αυτή παγώνει ολόκληρη την φόρμα μου μέχρι να ολοκληρωθεί, θα ήθελα πάρα
πολύ να ενημερώνω τον χρήστη σε ποιό στάδιο βρίσκομαι ανά πάσα στιγμή
όχι με ένα απλό progressbar αλλά με ένα label που κάθε φορά θα αναφέρει
ποιό στοιχείο "επεξεργάζεται" κάθε στιγμή. Χωρίς να γνωρίζω πολλά για
multithreading λοιπόν, αποφάσισα να χρησιμοποιήσω ένα backgroundworker. Πλεόν, με το κουμπί που συνήθως εκιννούσα τη διαδικασία, απλά καλώ την RunWorkerAsync method του Backgroundworker και στο DoWork event του Backgroundworker, πλέον έχω τον κώδικα που κάνει την παραπάνω εργασία, περίπου κάπως έτσι αλλά όχι με σταθερά νούμερα:
For i = 1 To 2000
ListBox1.Items.Add(i.ToString)
Label1.Text = "number no " & i.ToString & " is being proccessed"
Next
Φυσικά στο πρώτο τρέξιμο, έλαβα το ανάμενόμενο μήνυμα << Cross-thread operation not valid: Control 'ListBox1' accessed from a thread other than the thread it was created on. >>, επειδή όμως ήθελα να δω αν θα μπορούσε να δουλέψει έστω και έτσι, προσέθεσα την εντολή:
CheckForIllegalCrossThreadCalls = Falseακριβώς πριν μπεί στο βρόχο, οπότε και το πρόγραμμα έτρεξε κανονικά, με τη φορμά να ανταποκρίνεται πλήρως όσο γεμίζει το listbox και ταυτόχρονα να εμφανίζεται στο label σε real-time το στοιχείο που επεξεργάζεται ανά πάσα στιγμή.
Ερώτηση: Υπάρχει πρόβλημα που έθεσα false την παραπάνω επιλογή? Γιατί τότε μου επιτρέπεται να την απενεργοποιήσω? Αν ναί, ποιός θα ήταν ο απλούστερος τρόπος να ενημερώνω ένα αντικείμενο της φόρμας σε real-time, χρησιμοποιώντας όμως δεδομένα/μεταβλητές που αλλάζουν μέσα στο DoWork event του backgroundworker? Στο documentation διάβασα διάφορα για
threads και
delegates όμως δεν γνωρίζω καν τι είναι, πόσο μάλλον πως χρησιμοποιούνται.
Ευχαριστώ!