powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как реализовать такую идею ? Есть ли готовые решения ?
44 сообщений из 44, показаны все 2 страниц
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793541
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача такая:
В некий класс/сервис должны поступать задачи. В рамках задачи нужно работать с базой в рамках транзакции + вызовы к сторонним системам через HttpClient, в случае успеха выполнения которых нужно успешно закрывать транзакцию. При этом стоит требование об ограничении количества параллельно выполняющихся таких задач (тасков).

Соответственно по задумке, при поступлении задачи должен стартовать новый Task и что-то там делать. Общее количество работающих задач я планирую ограничить через семафор. Но сложность в том, чтобы реализовать следующее:
Нужно проконтролировать, что задачи при успешном И не успешном выполнении отчистят все ресурсы за собой: закроют соединение, освободят семафор, уберут ссылку на себя - чтобы не утекала память. На все время выполнения задачи ссылку на нее нужно где-то сохранять, чтобы сборщик мусора не убил, но затем эту ссылку нужно почистить.

Как такое можно реализовать ? Есть ли готовые решения ?
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793542
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте TaskScheduler
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793543
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точнее реализуйте свой. который будет запускать таск, с ограничением на количество, очередью выполнения и прочим, прочим, прочим
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793544
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesточнее реализуйте свой. который будет запускать таск, с ограничением на количество, очередью выполнения и прочим, прочим, прочим

Про TaskScheduler не знал, спасибо, буду копать. А вот необходимость реализовывать "ограничением на количество, очередью выполнения и прочим, прочим, прочим" как раз смущает ) Этого я и хотел избежать.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793595
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreЭтого я и хотел избежать
тогда программиста нанимать нужно
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793604
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Ищем, приходите на собеседование )
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793606
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насчет TaskScheduler я переборщил. Из головы вылетело про него. Обычно напрямую таски создаем через Task.Run.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793632
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreбазой в рамках транзакции + вызовы к сторонним системам через HttpClient,читать про РАСПРЕДЕЛЕННЫЕ транзакции.
Дорогая штука.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793639
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,
Код: c#
1.
System.Transactions
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793641
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreЭтого я и хотел избежать.дык у вас в ТЗ слова Ограничения/ограничить.)))
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793657
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,

в сторону pipeline- pattern смотрел?
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793663
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123WaspNewCoreбазой в рамках транзакции + вызовы к сторонним системам через HttpClient,читать про РАСПРЕДЕЛЕННЫЕ транзакции.
Дорогая штука.

Распределенные задачи не нужны !
Требуется чтобы созданный таск в рамках транзакции обрабатывал данные из бд. Запрашивал дополнительную информацию у стороннего сервиса, и успешно закрывал транзакцию после обработки. Либо падал с откатом транзакции, чтобы кто-то другой подхватил задачу и попробовал ее сделать.

Основная сложность, при поступлении задач, генерить таски не больше заданного одновременного количества (думаю через семафор), а также следить за тем, чтобы таски завершаясь освобождали ресурсы - тот же семафор. Соотвественно где-то хранить список текущих тасков, защищая их от сборщика мусора, и удалять завершенные.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793667
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_subWaspNewCore,

в сторону pipeline- pattern смотрел?

В первый раз слышу про него, это явно не классический от GOF. Почитаю, может придумаю как задействовать. Надеюсь это не просто producer-consumer..... Ой. Кстати. Может BlockingCollection поможет решить мою задачу, нужно подумать..
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793686
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreРаспределенные задачи не нужны !
Требуется чтобы созданный таск в рамках транзакции обрабатывал данные из бд. Запрашивал дополнительную информацию у стороннего сервиса, и успешно закрывал транзакциюможет в школу сходить?
Распределенные не задачи, я говорил, а транзакции.
Приводи пример уже что ли.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793689
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,
Если без распределенных, то обычная очередь для того чтобы другой подхватил.
Транзакция будет одна в одном блоке try.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793694
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreТребуется чтобы созданный таск в рамках транзакции обрабатывал данные из бд.все бд работают в рамках транзакции.
Комментируй.
Либо это лишние слова и ты просто читаешь из бд, и потом пишешь несколько операций одной транзакцией. Например 10 раз insert с откатом.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793697
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreОбщее количество работающих задач я планирую ограничить через семафор.вместо пула потоков с maxPoolingThread?
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793706
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Есть тонкость, которую я забыл упомянуть. Одновременно будет работать несколько таких сервисов, по обработке задач. Работать будут в одном приложении - в разных потоках. Поэтому ограничить через общий пул потоков не выйдет. Нужны индивидуальные настройки.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793709
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreЕсть ли готовые решения ?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private Task MyAsync()
{
	return Task.Run(() =>
		{
			// код в потоке
                        ReadDB
                        ReadSiteWEB
                        InsertDB
			...
		}
		);
}

ButtonsClick()
{
	await MyAsync();
}


Что по ТЗ упустил?
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793712
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreнесколько таких сервисовпереведи. Зачем?
У тебя и от одного сервиса весь проц будет занят.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793714
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreобщий пул потоковон общий вроде на процесс
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793718
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,
Задача равно поток. И не усложняй жизнь семафорами.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793720
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore, зачем ограничивать общее количество работающих задач?
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793727
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subWaspNewCore, зачем ограничивать общее количество работающих задач?+1
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793768
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Упущено ограничение на одновременную работу не более заданного числа.

Т.е. должно быть примерно так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Service
   RunWork ()
  {
        var semaphore = new SemaphoreSlim (maxCount)
        while (...)
        {
          var item = GetNextWorkItem ();
          Task currentWork = Task.Run (item...)
          
          и вот дальше  нужно сохранить ссылку на задачу,чтобы сборщик мусора не убрал. а когда таск завершится, 
          чтобы он сделал semaphore.Release() и удалит ссылку на себя, позволив сборщику мусора убрать за собой

          и при этом учесть вероятность, что таск может упасть, и должен тоже успеть вызвать semaphore.Release()
        }
  }
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793771
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123WaspNewCoreобщий пул потоковон общий вроде на процесс

Вот именно. Он общий на весь процесс. Поэтому если нам нужно, чтобы Service1 мог породить только 3 одновременно работающих таска, а Service2 - 5, то и начнется проблема. Которую я и думаю как решать.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793773
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_subWaspNewCore, зачем ограничивать общее количество работающих задач?

Да просто, чтобы не завалить сторонний сервис, к которому обращение идет через HttpClient, потоком запросов. Ну и вообще, нужна возможность конфигурировать нагрузку. Например, чтобы уменьшить нагрузку на базу.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793777
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreДа просто, чтобы не завалить сторонний сервис,смешно.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793783
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreНапример, чтобы уменьшить нагрузку на базу.еще смешнее.
maxPoolThread =2 и будет 2 запроса на всю базу.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793785
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreесли нам нужно, чтобы Service1 мог породить только 3 одновременно работающих таска, а Service2 - 5, тозачем 2 сервиса? Ты сам себе придумал задачу.
Типо есть один цикл for выбирающий очередь. Тебе захотелось два цикла for вызывающих один метод Run()
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793817
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Какие 2 ? Насколько я помню формула "количество процессов*2". С учетом гипертрединга 4х ядерный процесс даст 16 потоков.
Вот эти 16 потоков нужно распределить между несколькими классами-сервисами. Этому 3, другому 5.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793825
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123WaspNewCoreесли нам нужно, чтобы Service1 мог породить только 3 одновременно работающих таска, а Service2 - 5, тозачем 2 сервиса? Ты сам себе придумал задачу.
Типо есть один цикл for выбирающий очередь. Тебе захотелось два цикла for вызывающих один метод Run()

Каждый сервис обрабатывает данные по своей специфике. Это отдельные классы, в которых совершенно своя логика, и она может быть очень отличной.
Вся суть задачи - это сделать такой обработчик задач. Его будем расширять классами обработчиками. Их там уже штук 6 набирается. Но они не все одновременно будут работать. Вот я и думаю как это все реализовать.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793826
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WaspNewCorePetro123,

Какие 2 ? Насколько я помню формула "количество процессов*2". С учетом гипертрединга 4х ядерный процесс даст 16 потоков.
Вот эти 16 потоков нужно распределить между несколькими классами-сервисами. Этому 3, другому 5.

Количество Процессоров имелось ввиду. На сервере там может и больше вообще процессоров.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793838
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCorePetro123,

Какие 2 ? Насколько я помню формула "количество процессов*2". С учетом гипертрединга 4х ядерный процесс даст 16 потоков.
Вот эти 16 потоков нужно распределить между несколькими классами-сервисами. Этому 3, другому 5.
Нет. По умолчанию у меня 10 что ли потоков. Но механизм этот зависит не просто от ядер. В него просто не нажо лезть.
Зачем распределять? Распил бабла? Если доводов нет.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793842
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreЕго будем расширять классами обработчиками.выше я 3 метода написал. Внутри них нельзя расширить бизнес логику?
Сервис это запускалка. А логика в классе MyЛогика.Run();
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793846
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreС учетом гипертрединга 4х ядерный процесс даст 16 потоков.
Вот эти 16 потоков нужно распределить между несколькими классами-сервисами. Этому 3, другому 5.ты 16-тью потоками запросами боишься веб сервис положить? Ну смешно же.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793854
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

дело еще не в столько, чтобы не положить, но и в том, чтобы они между собой не конкурировали за потоки. Чтобы не стартануло 16 длительных задач, не дающих работать быстрым. Поэтому и нужно распределение пула потоков между ними.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793855
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123WaspNewCoreЕго будем расширять классами обработчиками.выше я 3 метода написал. Внутри них нельзя расширить бизнес логику?
Сервис это запускалка. А логика в классе MyЛогика.Run();

ну вот нужно еще, чтобы они после своей работы семафор отпускали. плюс учитывать вероятность ошибок - падений. Чтобы при этом тоже семафор почистился.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793857
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreмежду собой не конкурировали за потоки.кто они?
Поток изолирован или выше писал что поток это задача.
Где конкуренция?
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793860
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreсемафорсемафор не бывает без общего разделяемого ресурса. А его нет. Задачи параллельные. Смотри код.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793861
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreплюс учитывать вероятность ошибок - паденийtry при async работает. Попробуй)
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793864
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,
Есть анекдот, когда мужик в поезде очищал банан, потом солил, и выбрасывал в окно. На вопрос зачем? Он отвечал что не любит соленые бананы.
Так и ты ввел семафор и спрашиваешь как с ним тут работать.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793868
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКласс System.Threading.ThreadPool обеспечивает приложение пулом рабочих потоков, управляемых системой, позволяя пользователю сосредоточиться на выполнении задач приложения, а не на управлении потоками.
...
Рейтинг: 0 / 0
Как реализовать такую идею ? Есть ли готовые решения ?
    #39793869
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЧисло операций, которое можно поставить в очередь в пуле потоков, ограничено только доступной памятью. Однако пул потоков имеет ограничение на число потоков, которое можно активировать в процессе одновременно. Если все потоки в пуле заняты, дополнительные рабочие элементы помещаются в очередь и ожидают их освобождения. Начиная с .NET Framework 4, размер пула потоков по умолчанию для какого-либо процесса зависит от нескольких факторов, таких как размер виртуального адресного пространства. Процесс может вызвать метод ThreadPool.GetMaxThreads для определения количества потоков.
Вы можете управлять максимальным количеством потоков с помощью методов ThreadPool.GetMaxThreads и ThreadPool.SetMaxThreads.я MS верю))
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как реализовать такую идею ? Есть ли готовые решения ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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