Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/81: Рейтинг темы: голосов - 81, средняя оценка - 4.70
28 / 28 / 5
Регистрация: 24.03.2013
Сообщений: 238

BackgroundWorker просьба выложить пример в 10 потоков

08.04.2013, 00:03. Показов 15032. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер.

Кому не сложно скиньте пожалуйста простейший пример реализации 10 потоков на backgroundWorker, в интеренте куча примеров, но основаны на 1 потоке.

Спасибо.

p.s. просьба не постить линк на msdn, статью читал.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.04.2013, 00:03
Ответы с готовыми решениями:

BackgroundWorker, несколько потоков и процент выполнения
Здравствуйте, На форме есть кнопка и label (из примера...

Пример многопотока Backgroundworker
Нашел такую тему: Клик Но в ней только консольный вариант. Мне бы хотелось увидеть пример с WinForms (хотя разницы вроде нет) и с вызовом...

Пример использования потоков
Форумчане , все ни как не могу догнать как потоки используются а про async и await вообще молчу. Кому не трудно можете на примере показать....

8
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
08.04.2013, 09:54
Тебе нужно запускать 10 экземпляров BackgroundWorker? Почему именно их?
0
28 / 28 / 5
Регистрация: 24.03.2013
Сообщений: 238
08.04.2013, 16:08  [ТС]
Цитата Сообщение от Casper-SC Посмотреть сообщение
Тебе нужно запускать 10 экземпляров BackgroundWorker? Почему именно их?
Хотелось бы понять принцип запуска и синхронизации нескольких потоков именно на BackgroundWorker, т.к. нет необходимости в Invoke.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
08.04.2013, 16:36
Вот смотри в проекте. Если не понятно, что за методы у BackgroundWorker, что за события, то наводишь курсор мыши и там всё написано, на крайняк клацаешь на методе/событии и жмёшь F1, всё предельно ясно описано.
Вложения
Тип файла: zip WinForms_BackgroundWorker.zip (22.4 Кб, 441 просмотров)
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.04.2013, 17:20
Консольный вариант:
C#
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.ComponentModel;
using System.Threading;
 
class Program
{
    const int ThreadCount = 10;
 
    static readonly Random r = new Random();
    static readonly object sync = new object();
    static readonly CountdownEvent countdown = new CountdownEvent(ThreadCount);
    static readonly BackgroundWorker[] workers = new BackgroundWorker[ThreadCount];
 
    static void Main(string[] args)
    {
        Console.CursorVisible = false;
        Console.WriteLine("Starting the workers...");
 
        for (int i = 0; i < workers.Length; i++)
        {
            workers[i] = new BackgroundWorker();
            workers[i].WorkerSupportsCancellation = true;
            workers[i].WorkerReportsProgress = true;
            workers[i].DoWork += DoWork;
            workers[i].ProgressChanged += ProgressChanged;
            workers[i].RunWorkerCompleted += RunWorkerCompleted;
            workers[i].RunWorkerAsync(i + 1);
        }
 
        while (!countdown.Wait(TimeSpan.FromMilliseconds(100)))
            if (Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape)
                Array.ForEach(workers, w => w.CancelAsync());
 
        Console.SetCursorPosition(0, workers.Length + 1);
        Console.ResetColor();
        Console.WriteLine("All workers finished!\r\nPress any key to continue...");
        Console.ReadKey(true);
    }
 
    static void DoWork(object sender, DoWorkEventArgs e)
    {
        var worker = sender as BackgroundWorker;
        e.Result = e.Argument;
 
        int progress = 0;
        do
        {
            worker.ReportProgress(progress, e.Argument);
            int interval;
            lock (r) interval = r.Next(1000);
            Thread.Sleep(interval);
        } while (progress++ < 100 && !worker.CancellationPending);
    }
 
    static void ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        int x = e.ProgressPercentage * 40 / 100 + 5;
        int y = (int)e.UserState;
        var color = (ConsoleColor)(y + 1 % Enum.GetValues(typeof(ConsoleColor)).Length);
 
        lock (sync)
        {
            Console.ForegroundColor = color;
            Console.SetCursorPosition(0, y);
            Console.Write("{0,3}%", e.ProgressPercentage);
            Console.SetCursorPosition(x, y);
            Console.Write('\u2592');
        }
    }
 
    static void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        countdown.Signal();
    }
}
2
28 / 28 / 5
Регистрация: 24.03.2013
Сообщений: 238
08.04.2013, 21:49  [ТС]
Уточняющий вопрос, как передать переменную в DoWork? Т.е. в код который выполняется в DoWork нужно передать строку которая содержит ссылку на интернет ресурс, как можно её правильно передать?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
08.04.2013, 21:53
К примеру как в том проекте:
C#
1
2
3
4
5
6
7
8
        private void StartButton_Click(object sender, EventArgs e)
        {
            if (!_bw.IsBusy)
            {
                var tuple = new Tuple<string, int>("http://www.google.ru/", progressBar.Maximum);
                _bw.RunWorkerAsync(tuple); //Передаём
            }
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        void Bw_DoWork(object sender, DoWorkEventArgs e)
        {
            var tuple = (Tuple<string, int>)e.Argument; //Получаем
            string webSite = tuple.Item1;
            int iterations = tuple.Item2 + 1;
 
            BackgroundWorker bw = (BackgroundWorker)sender;
            int data = 0;
            for (int i = 0; i < iterations; i++)
            {
                if (bw.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
                bw.ReportProgress(i);
                Thread.Sleep(100);
                data += 50;
            }
 
            e.Result = data;
        }
2
28 / 28 / 5
Регистрация: 24.03.2013
Сообщений: 238
11.04.2013, 09:57  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Консольный вариант:
C#
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.ComponentModel;
using System.Threading;
 
class Program
{
    const int ThreadCount = 10;
 
    static readonly Random r = new Random();
    static readonly object sync = new object();
    static readonly CountdownEvent countdown = new CountdownEvent(ThreadCount);
    static readonly BackgroundWorker[] workers = new BackgroundWorker[ThreadCount];
 
    static void Main(string[] args)
    {
        Console.CursorVisible = false;
        Console.WriteLine("Starting the workers...");
 
        for (int i = 0; i < workers.Length; i++)
        {
            workers[i] = new BackgroundWorker();
            workers[i].WorkerSupportsCancellation = true;
            workers[i].WorkerReportsProgress = true;
            workers[i].DoWork += DoWork;
            workers[i].ProgressChanged += ProgressChanged;
            workers[i].RunWorkerCompleted += RunWorkerCompleted;
            workers[i].RunWorkerAsync(i + 1);
        }
 
        while (!countdown.Wait(TimeSpan.FromMilliseconds(100)))
            if (Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape)
                Array.ForEach(workers, w => w.CancelAsync());
 
        Console.SetCursorPosition(0, workers.Length + 1);
        Console.ResetColor();
        Console.WriteLine("All workers finished!\r\nPress any key to continue...");
        Console.ReadKey(true);
    }
 
    static void DoWork(object sender, DoWorkEventArgs e)
    {
        var worker = sender as BackgroundWorker;
        e.Result = e.Argument;
 
        int progress = 0;
        do
        {
            worker.ReportProgress(progress, e.Argument);
            int interval;
            lock (r) interval = r.Next(1000);
            Thread.Sleep(interval);
        } while (progress++ < 100 && !worker.CancellationPending);
    }
 
    static void ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        int x = e.ProgressPercentage * 40 / 100 + 5;
        int y = (int)e.UserState;
        var color = (ConsoleColor)(y + 1 % Enum.GetValues(typeof(ConsoleColor)).Length);
 
        lock (sync)
        {
            Console.ForegroundColor = color;
            Console.SetCursorPosition(0, y);
            Console.Write("{0,3}%", e.ProgressPercentage);
            Console.SetCursorPosition(x, y);
            Console.Write('\u2592');
        }
    }
 
    static void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        countdown.Signal();
    }
}
А как возможно добиться того чтобы сначала завершался первый поток, потом второй, третий ну и т.д.
Т.е. завершать потоки по порядку или отдавать результат из RunWorkerCompleted по порядку.
Спасибо.
1
 Аватар для Dr_FvKE
14 / 11 / 1
Регистрация: 16.08.2016
Сообщений: 75
07.01.2017, 17:28
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2017, 17:28
Помогаю со студенческими работами здесь

Несколько BackgroundWorker потоков
Добрый вечер. Возникла проблема с потоками BackgroundWorker. Есть код: static BackgroundWorker bw2 = new BackgroundWorker(); ...

А как на сайт ПРИМЕР выложить?
СУбж

Пример потоков в VBA
Доброго времени суток всем. Прошу помочь разобраться с одним вопросом. Не могу разобраться с потоками в VBA (В частости Access) Я...

Простой пример потоков
public class ClassForStudy { public static void main(String args){ theThread t1 = new theThread(&quot;один&quot;); ...

Синхронизация потоков. Простенький пример
Здравствуйте уважаемые форумчане! Прошу помощи экспертов! Дано 3 класса... public class Data { private int state = 1; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru