Threading with. Net Core - PullRequest
       22

Threading with. Net Core

0 голосов
/ 17 февраля 2020

Я пытаюсь создать серию микросервисов и в настоящее время работаю над базовым классом для них, используя консольное приложение. Net Core. Цель состоит в том, чтобы службы, развернутые в виде контейнеров Docker, могли отслеживать источник информации (Кафка, SQL и т. Д.) И затем активироваться, когда они находят свой триггер. Разработчик должен иметь возможность просто захватить этот базовый класс и поместить свои логи c на место, не беспокоясь о том, что логи c запускают его или любые другие базовые логи службы c.

Для этого я пытаюсь использовать многопоточность в базовом классе таким образом, чтобы пользователю класса не приходилось с этим сталкиваться, но служба реагировала и могла отслеживать / реагировать на внешние команды (например, возможность получить статус, отменить работу и т. д. c). К сожалению, похоже, что Microsoft пытается покончить с System.Threading в ядре. Net, поскольку я могу запускать их потоки, но не могу их остановить. Это исключает возможность отмены / приостановки работы, что, в свою очередь, исключает возможность завершения работы службы, поскольку я не могу остановить поток.

Я смотрел на Задачи, но они, похоже, предназначены для веб-разработки. , На самом деле большинство, если не вся информация, которую я нашел о многопоточности и микросервисах в. Net Ядро относится к созданию WebAPI в ASP. Net. Кроме этого я действительно не нашел много информации о том, как использовать System.Threading теперь, когда все элементы управления, кроме .Start, кажется, были удалены.

Я собираюсь взглянуть на систему, где у меня есть Поток размещает Задачу, затем попробуйте использовать элементы управления Задачей, чтобы посмотреть, смогу ли я отменить ее, а затем просто аккуратно отбросить поток (аналогично ответу здесь: do tnet ядро, эквивалентное Thread.Abort ) , Это неправильно, как будто я делаю башню зубочистки, которая может легко сломаться, однако мне нужно, чтобы базовый сервис контролировал нить; Я не хочу, чтобы я или другие люди постоянно проверяли токен в своей логике c, чтобы увидеть, должен ли поток быть закрыт.

Есть ли лучший способ понять, что я пытаюсь сделать здесь? Я искал несколько дней, но продолжаю сталкиваться с одним и тем же, и все дело в том, как сделать webapis с помощью Tasks, что совсем не похоже на то, что я пытаюсь сделать здесь; они останавливают основной лог c, а не работают независимо. Думаю, это раздражающий побочный продукт этого «все должно быть на сайте» настроения в отрасли. Не уверен, что я упускаю что-то очевидное, задавая неправильные вопросы, или это будет просто странная работа.

1 Ответ

2 голосов
/ 17 февраля 2020
Языковые функции

Task и await / async являются хорошим способом абстрагировать многопоточность и должны точно помочь вам в том, для чего вы sh (поддержите отзывчивость приложения, используя пул потоков), в то время как избавляя вас от хлопот правильного создания и управления всеми этими потоками (не говоря уже о перехвате исключений во время асинхронного выполнения).

Как указано в комментариях, я думаю, что вы должны попробовать "правильно" и затем измерить, если он соответствует вашим целям производительности.

Некоторые функции, возвращающие Задачу, возвращают им «горячий» (то есть уже выполняющий свою работу). Если вы не хотите sh приостановить основной поток, просто не ждите Задание, возвращаемое до конца вашего рабочего процесса. Кстати, это должно иметь место при использовании Task.Run.

Иногда Task "холодны" и запускаются автоматически при вызове await. Но вы можете запустить их вручную, не ожидая их, используя Task.Start.

Конечно, использование задач имеет свои подводные камни, и вы все равно должны знать, что он делает за кулисами. Вы все еще можете выполнять «плохие» процессы программирования потоков, например вызывать взаимные блокировки в некоторых ситуациях или не обрабатывать исключения.

Дальнейшее чтение, выбранное среди многих:

, но есть еще много.

...