Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1

Если усыпить BackgroundWorker, то ещё один новый поток созданный внутри DoWork тоде усыпиться?

13.06.2011, 20:33. Показов 1350. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                BackgroundWorker bw = new BackgroundWorker();
                bw.DoWork += (object sender1, DoWorkEventArgs e1) =>
                {
                    BackgroundWorker bwAdd = new BackgroundWorker();
                    foreach (string link in ObsCollLinksFromFile)
                    {
                        while (bwAdd.IsBusy)
                        {
                            Thread.Sleep(150);
                        }
                        Dispatcher.Invoke(new Action(() =>
                            {
                                progressBar.Value += 1;
                            }));
                        AddToListForIteration(bwAdd, link, obsCollOneTemp, obsCollTwoTemp, obsCollThreeTemp);
                    }
                };
AddToListForIteration можно по идее выполнить вне DoWork, то есть не выделяя под работу поток, но тогда этот цикл выполнится практически моментально. Например произойдёт 10 итераций цикла, то внутри AddToListForIteration, BackgroundWorker создаст 10 потоков (и то если мы не будем передавать в метод уже созданный BackgroundWorker, а внутри метода будем создавать его). А мне надо, чтобы пока работает bwAdd следующая итерация цикла не происходила, вот я и добавил:
C#
1
2
3
4
while (bwAdd.IsBusy)
{
   Thread.Sleep(150);
}
Но у меня подозрение, что Thread.Sleep(150); усыпляет и поток внутри AddToListForIteration. В итоге некоторые итерации длятся неимоверно долго.

А вообще почему мне нужно, чтобы не псоздавалось много потоков: Потому-что я в методе AddToListForIteration получаю определённые данные из интернета, если выполнить цикл в 2000 итераций, то я думаю ничего у меня не выйдет. У получения данных из инета есть TimeOut так что долго ждать тоже не получится. Вот и пришлось мне сделать цикл, чтобы в данный момент времени в другом потоке выполнялось только одно обращение к интернету. Что я толко не думал, чтобы как-то заменить этот Thread.Sleep(150); но ничего не придумал.

Добавлено через 41 минуту
Короче решил проблему тем, что убрал из AddToListForIteration BackgroundWorker bwAdd. Теперь внутри этого метода вообще не создаётся поток (сглупил, просто был готовый метод и для цикла в новом потоке он не подходил, я его скопировал и не решался переписывать, так как он сложноват). Короче говоря убрал торможение потока, всё работает теперь так быстро, что аж непривычно видеть такую скорость.
Теперь он такой (если кто не понял):
C#
1
2
3
4
5
6
7
8
9
10
11
12
                BackgroundWorker bw = new BackgroundWorker();
                bw.DoWork += (object sender1, DoWorkEventArgs e1) =>
                {
                    foreach (string link in ObsCollLinksFromFile)
                    {
                        Dispatcher.Invoke(new Action(() =>
                        {
                            progressBar.Value += 1;
                        }));
                        AddToListForIteration(link, obsCollOneTemp, obsCollTwoTemp, obsCollThreeTemp);
                    }
                };
Короче тема ниочём , думаю можно удалить.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.06.2011, 20:33
Ответы с готовыми решениями:

Backgroundworker RunWorkerCompleted обработка ошибки в DoWork
Есть код: Private Sub bgUsers_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgUsers.DoWork . . . ...

не создает еще один поток
пытаюсь создать еще один поток(четвертый,помимо 2-х форм,если это важно) вот собственно листинг,где запускается поток unit Unit5; ...

Новый поток внутри класса
Всем привет, решил попытаться оседлать многопоточность. Но увы тут же наткнулся на полное отсутствие информации. Серьёзно, на любом...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.06.2011, 20:33
Помогаю со студенческими работами здесь

Как грамотно усыпить поток
Всем доброго времени суток. Недавно заинтересовал вопрос "грамотного" усыпления потока, ясное дело хотелось бы развивать дискусию(если...

Std::thread как усыпить/ пробудить поток?
Есть ли в std::thread возможность как - то приостановить поток, не разрушая его, а потом, по какому - то сигналу / прерыванию - возобновить...

Сколькими способами можно выбрать 6 шаров, если один из них должен быть синим, а еще один - жёлтым
В урне находятся 3 красных, 5 синих, 2 жёлтых и 4 зеленых шара. Сколькими способами можно выбрать 6 шаров, если один из них должен быть...

Как усыпить текущий поток, не усыпляя все остальные?
Привет. У меня есть устройство, с которым я общаюсь через COM-порт. class RS232_Board : public QObject { Q_OBJECT private: ...

Добавить еще один поток, который выводит на экран другое сообщение каждые 7 секунд
Есть задача: Напишите программу, которая каждую секунду отображает на экране данные о времени, прошедшем от начала сессии, а другой ее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru