powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Очередь потоков
17 сообщений из 17, страница 1 из 1
Очередь потоков
    #39506755
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть задача, считывать данные из бд и запускать в отдельных потоках метод, который будет обрабатывать данные и записывать их в БД. Никакого ГУИ, это служба windows. Кол-во потоков ограничено параметром из конфига. Подскажите, пожалуйста, простое и удобное решение, дабы не изобретать велосипед. Что лучше подойдет для решения задачи: таски или потоки?
...
Рейтинг: 0 / 0
Очередь потоков
    #39506768
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО с потоками проще. При старте создал сколько надо, а дальше каждый в цикле: прочитал, посчитал, записал.
...
Рейтинг: 0 / 0
Очередь потоков
    #39506788
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Пав, можно завернуть все это дело в блоки TPL Dataflow ... будет аккуратненько... вся инфраструктура для этого там есть...
...
Рейтинг: 0 / 0
Очередь потоков
    #39506792
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserСупер_Пав, можно завернуть все это дело в блоки TPL Dataflow ... будет аккуратненько... вся инфраструктура для этого там есть...
сейчас посмотрю, спасибо
...
Рейтинг: 0 / 0
Очередь потоков
    #39506824
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Пав,
Если нет гуи которое тормозит, то потоки не нужны....в общем случае.
...
Рейтинг: 0 / 0
Очередь потоков
    #39506866
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал небольшой класс, который удовлетворяет моим задачам.
Код: 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.
namespace TaskQueue
{
    internal struct TaskInfo
    {
        public string Id { get; set; }
        public Task Task { get; set; }

        public TaskInfo(string id, Task task)
        {
            Id = id;
            Task = task;
        }
    }

    internal class TaskQueue
    {
        private readonly object _theLock = new object();
        private readonly int _maxTaskCount;
        private readonly ICollection<TaskInfo> _runningTaskList;
        private readonly ICollection<TaskInfo> _waitingTaskList;

        public TaskQueue(int maxTaskCount)
        {
            _maxTaskCount = maxTaskCount;
            _runningTaskList = new List<TaskInfo>();
            _waitingTaskList = new List<TaskInfo>();
        }

        public void AddTask(TaskInfo taskInfo)
        {
            lock (_theLock)
            {
                if (_runningTaskList.Count < _maxTaskCount)
                {
                    if (_waitingTaskList.Contains(taskInfo))
                        _waitingTaskList.Remove(taskInfo);

                    _runningTaskList.Add(taskInfo);
                    taskInfo.Task.ContinueWith(ContinueWith);
                    taskInfo.Task.Start();
                }
                else
                {
                    if (!_waitingTaskList.Contains(taskInfo))
                    {
                        _waitingTaskList.Add(taskInfo);
                        Console.WriteLine($"Task {taskInfo.Id} waiting....");
                    }
                }
            }
        }

        private void ContinueWith(Task task)
        {
            lock (_theLock)
            {
                _runningTaskList.Remove(_runningTaskList.FirstOrDefault(t => t.Task == task));
                if(_waitingTaskList.Count > 0)
                    AddTask(_waitingTaskList.FirstOrDefault());
            }
        }
    }
}


Код: 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.
namespace TaskQueue
{
    public class Program
    {
        static void Main()
        {
            var queue = new TaskQueue(5);

            for (var i = 0; i < 10; i++)
            {
                var guid = Guid.NewGuid().ToString().Substring(0, 4);
                Console.WriteLine($"Creating task {guid}");

                var task = new Task(() => Method(guid));
                queue.AddTask(new TaskInfo(guid, task));
            }
            
            Console.WriteLine("Completed, press any key to quit.");
            Console.ReadLine();
        }

        private static void Method(string id)
        {
            Console.WriteLine($"Execute task {id}");
            Thread.Sleep(5000);
        }
    }
}


Критика адекватная приветствуется.
...
Рейтинг: 0 / 0
Очередь потоков
    #39506970
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://msdn.microsoft.com/ru-ru/library/ee789351(v=vs.100).aspx

можно тупо взять пример, инициализировать с параметром 1 и тогда все таски в этом шадулере будут выполняться последовательно, а не паралельно. И не надо изобретать велосипед
...
Рейтинг: 0 / 0
Очередь потоков
    #39507025
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Пав,

Есть специальные многопоточные коллекции, чтобы не педалить через lock.
Я бы лучше использовал Quartz.
...
Рейтинг: 0 / 0
Очередь потоков
    #39507030
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes https://msdn.microsoft.com/ru-ru/library/ee789351(v=vs.100).aspx

можно тупо взять пример, инициализировать с параметром 1 и тогда все таски в этом шадулере будут выполняться последовательно, а не паралельно. И не надо изобретать велосипед
не скажу, что написал большой велосипед. У меня чтение данных из бд заложено по таймеру. Инициализация кол-ва потоков происходит 1 раз, дальше добавляю новые таски по мере чтения данных из БД
...
Рейтинг: 0 / 0
Очередь потоков
    #39507048
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Пав,

дело ваше, вы просили критику, я вам предоставил альтернативный вариант, от MS, его можно сильно упростить, если не требуется параллелизация выполненения.
Используйте свой, если вам он ближе. Смысл в том, что создавая таски, они так и так у вас выполняются в рамках какого то шадулера, которым вы ни как не управляете. А представленном мною варианте, вы используйте свой шедулер, можно сделать его статичным и использовать всего, когда нужно закинуть в очередь выполнения новый таск и все они будут ожидать выполнение предыдущих.
Я вас не агетирую использовать, просто показал альтернативу, более кононичную , не зря же придумали планировщики :)
...
Рейтинг: 0 / 0
Очередь потоков
    #39507073
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesСупер_Пав,

дело ваше, вы просили критику, я вам предоставил альтернативный вариант, от MS, его можно сильно упростить, если не требуется параллелизация выполненения.
Используйте свой, если вам он ближе. Смысл в том, что создавая таски, они так и так у вас выполняются в рамках какого то шадулера, которым вы ни как не управляете. А представленном мною варианте, вы используйте свой шедулер, можно сделать его статичным и использовать всего, когда нужно закинуть в очередь выполнения новый таск и все они будут ожидать выполнение предыдущих.
Я вас не агетирую использовать, просто показал альтернативу, более кононичную , не зря же придумали планировщики :)

Нене, спасибо за ответ. Я обязательно посмотрю и изучу материал=)
...
Рейтинг: 0 / 0
Очередь потоков
    #39507205
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Petro123Супер_Пав,
Если нет гуи которое тормозит, то потоки не нужны....в общем случае.
+1
Скуль-сервер сам разрулит запросы лучше
...
Рейтинг: 0 / 0
Очередь потоков
    #39507213
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,
и добавлю, что фоновый ПРОЦЕСС быстрее чем поток.
...
Рейтинг: 0 / 0
Очередь потоков
    #39509460
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Павсчитывать данные из бд и запускать в отдельных потоках метод, который будет обрабатывать данные и записывать их в БД
Делать последовательно. Или у вас временные затраты на расчеты этих данных сопоставимы по скорости чтения/записи в БД?
...
Рейтинг: 0 / 0
Очередь потоков
    #39509584
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Petro123Супер_Пав,
Если нет гуи которое тормозит, то потоки не нужны....в общем случае.
+1
Скуль-сервер сам разрулит запросы лучше

ересь несете оба
...
Рейтинг: 0 / 0
Очередь потоков
    #39509586
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а для задачи ТС есть готовые вещи, типа - https://msdn.microsoft.com/ru-ru/library/ee362541(v=sql.111).aspx
...
Рейтинг: 0 / 0
Очередь потоков
    #39509722
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosа для задачи ТС есть готовые вещи, типа - https://msdn.microsoft.com/ru-ru/library/ee362541(v=sql.111).aspx
Это не то.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Очередь потоков
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]