На форме имеется компонент ListBox. В процессе работы необходимо его заполнять данными из потока. Схема работы такая: основной поток порождает BackgroundWorker(назовём поток А), который, в свою очередь, порождает ещё 10 BackgroundWorker'ов(потоки Б). Поток А передаёт в потоки Б параметры и запускает их на выполнение. Каждый поток Б, выполнившись, хранит результат в переменной result. Поток А проверяет эту переменную и должен записать её в ListBox. В отладчике я вижу, что переменная result содержит строку, но после выполнения mylist.Items.Add(mythreads[k].result); добавляется пустая строка. Каким образом исправить сие?
Судя по всему, никаких действий по синхронизации потоков нет? Конечно результат может быть не определен.
Нет. Но зачем она нужна в данном случае?! Потоки Б - классы. Каждый экземпляр хранит свой результат. Даже если ставить не 10,а 1 поток и в отладчике видно, что строка есть, она не добавляется. Как будто GC раньше времени стирает экземпляр.
Тогда я ничего не пойму - зачем использовать множества потоков, если нет конкуренции за ресурс(ListBox)? Это один из признаков что от применения потоков можно обойтись. И как поток А узнает что какой то из потоков окончил задания - опрашивает их или как кто изврашено вешается на event RunWorkerCompletedEventHandler. Покажи код.
Множество потому, что брутфорс Поток А - для того,чтобы приложение не висело и результат был виден в реальном времени. Да, опрашивает. Умнее придумать не смог. Code: for (int k = 0; k < mythreads.Length; ) { if (mythreads[k].Completed == true) { if (mythreads[k].result.Length > 0) { mylist.Items.Add(mythreads[k].result); } mythreads[k].Start(n); break; } if (++k >= Bruts.Length) k = 0; } Алгоритм такой: 1. Ищем завершённый поток. 1.1 Если есть результат, то заносим в лист. 1.2 Запускаем его с новым параметром(n). 2. Циклимся пока не появится завершённый поток.
Да подход конечно не очень, а где именно в ListBox добавляешь - непосредственно в _DoWork методе потока А через delegate, или в .ReportProgress потока А. Если через .ReportProgress, вполне возможно что до того как туда что то уходит происходить Dispose потока В и ты не правильно заносишь, также если пишешь через Object userState нужно приводить к соответствующему типу.
ну вот, а уже многопоточные приложения пишешь... была тема https://forum.antichat.ru/thread227512-delegate.html