Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
8 / 8 / 3
Регистрация: 22.10.2010
Сообщений: 93
1

Один backgroundworker и много методов

11.05.2017, 21:16. Просмотров 906. Ответов 5
Метки нет (Все метки)

Здравствуйте!!!!
Такой вопрос:
Есть много разных методов, довольно длительных по времени выполнения, которые желательно запускать в фоновом режиме.

Как можно в один BGW подавать разные методы?

В backgroundworker_DoWork() { } передавать название метода, который нужно выполнять.

Или если мой ход мыслей не правильный, то как можно такое реализовать?

Спасибо!

Добавлено через 3 часа 25 минут
В дополнение к этому вопросу ещё один:
Если есть коллекция List<T> и с ней надо работать, анализировать и всякое другое. Можно ли эту одну коллекцию параллельно использовать в разных методах в один и тот же момент?
И всё это запускать через BGW
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2017, 21:16
Ответы с готовыми решениями:

Много методов или много классов. Что лучше?
Имеется библиотека(ActiveX DLL), в которую, в своё время, было решено складировать функции,...

Запустить несколько методов в backgroundworker
Запустить несколько методов через backgroundworker, как это сделать? поднял!

Хочу один системник и много-много мониторов+клавиатур+мышей. Как?
Вопрос: как реализовать возможность одновременной работы на одном системнике нескольким людям...

Слишком много методов
Вот такая ошибка: Error:Execution failed for task ':app:transformClassesWithDexForDebug'. &gt;...

5
132 / 128 / 107
Регистрация: 17.03.2009
Сообщений: 364
11.05.2017, 21:26 2
Вот небольшой пример. Надо использовать несколько воркеров. С одним воркером надо использовать меотды последовательно. Для этого можно вызывать их внутри события DoWork или рестартовать воркер внутри RonWorkeCompleted.

С List<T> можно работать, но операции с им делать через lock

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
namespace BackgroundWorker
{
    class Program
    {
        
 
        static void Main(string[] args)
        {
            var worker1 = new System.ComponentModel.BackgroundWorker();            
            var array = new int[] {1,2,3,4,5};
            worker1.DoWork += Worker1OnDoWork;
            worker1.RunWorkerCompleted += WorkerCompleted;
 
            var tuple = new Tuple<string, string>("Задача 2", "Строка 2");
            var worker2 = new System.ComponentModel.BackgroundWorker();
            worker2.DoWork += Worker2OnDowork;
            worker2.RunWorkerCompleted += WorkerCompleted;
            
            
            worker1.RunWorkerAsync(array);
            worker2.RunWorkerAsync(tuple);
 
            Console.WriteLine("Главная нить, нажмите любую кнопку");
            Console.ReadKey();
        }
 
        private static void Worker2OnDowork(object sender, DoWorkEventArgs e)
        {
            var tuple = (Tuple<string, string>)e.Argument;
            Console.WriteLine(tuple.Item1+ " "+tuple.Item2);
            
        }
 
        private static void Worker1OnDoWork(object sender, DoWorkEventArgs e)
        {
            var arr = (int[])e.Argument;
            Console.WriteLine(String.Join(" ", arr));
            Thread.Sleep(1000);
        }
 
        private static void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Console.WriteLine("Фоновая задача завершена");
            Console.ReadKey();
        }
 
    }
}
1
8 / 8 / 3
Регистрация: 22.10.2010
Сообщений: 93
11.05.2017, 21:38  [ТС] 3
Спасибо большое!!!
А через через параметр передавать название метода и использовать только один BGW ?
Так можно или это не возможно?
0
132 / 128 / 107
Регистрация: 17.03.2009
Сообщений: 364
11.05.2017, 22:39 4
Нет, можно передавать массив методов и выполнять их последовательно. Либо выполнять их последовательно в событии DoWork.

http://stackoverflow.com/quest... undworkers


Но вы можете использовать Task.Run и Task.WaitAll для своих целей, что куда проще и гибче, чем BGW.
Смотрите, насколько элегантнее выглядит код:

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
    class Program
    {
        static void Method1(int[] arr) 
        {
            Thread.Sleep(1000);
            Console.WriteLine(String.Join(" ", arr));
        }
 
 
        static void Main(string[] args)
        {
 
            var array = new int[] {1,2,3,4,5};
            var tuple = new Tuple<string, string>("Задача 2", "Строка 2");
 
 
            var task1 = Task.Run( () => Method1(array) ,);
            var task2 = Task.Run(() => { Console.WriteLine(tuple.Item1 + " " + tuple.Item2); });
            Task.WaitAll(new Task[] { task1, task2});
 
            Console.WriteLine("Задачи завершены. Нажмите любую клавишу...");
            Console.ReadKey();
        }
    }
1
8 / 8 / 3
Регистрация: 22.10.2010
Сообщений: 93
12.05.2017, 09:16  [ТС] 5
Спасибо большое!
Но, как я понимаю, использование Task хорошо для консольного приложения, а если используется форма?
И ещё хотелось видеть визуально процесс вычислений через progress Bar
0
132 / 128 / 107
Регистрация: 17.03.2009
Сообщений: 364
12.05.2017, 10:40 6
Цитата Сообщение от Speedy Gonzales Посмотреть сообщение
Но, как я понимаю, использование Task хорошо для консольного приложения, а если используется форма?
Это не зависит от типа приложения, будь то консольное, WinWorms, WPF или ASP.NET.

Добавлено через 55 минут
Насчет ProgressBar.

Вот код, для его выполнения надо бросить на форму ProgressBar и кнопку, назвать ее button3 и в св-ве Text написать "Старт". В событии button3_Click прописать так:

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
        private void button3_Click(object sender, EventArgs e)
        {
            if (button3.Tag == null)
            {
                button3.Text = "Отмена";
                button3.Tag = 1;
                progressBar1.Value = 0;
                IProgress<int> progress =
                            new Progress<int>(value => progressBar1.Value = value);
                Task.Run(() =>
                {
                    for (var i = 0; i < 10; i++)
                    {
                        Thread.Sleep(1000);
                        progress.Report(i * 10);
                        if (button3.Tag == null) break; //Если нажата кнопка в режиме "Отмена"
                    }
                    progress.Report(100);
                });
            }
            else 
            {
                button3.Tag = null;
                button3.Text = "Старт";
            }
 
        }
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2017, 10:40

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как оптимизировать код, где используется много методов .Contains?
Здравствуйте! Есть задача поиска всех url'ов на каком то сайте и найти в них битые/небитые. Задачу...

Aspectj не срезает один из методов
есть класс class ToCut { @CutHere(&quot;1&quot;) public MyObject method1(args) {} @CutHere(&quot;2&quot;) ...

Запуск методов один за другим
Есть два метода A и B Как сделать так, что бы методы работали поочередно. Т.есть метод A...

Рандомно взять один из методов
как зделать чтоб метод рандомно выберал из 4 методов (причем рандомное количество раз?)


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.