#c# #asp.net #multithreading
#c# #asp.net #многопоточность
Вопрос:
У меня есть IHttpHandler, который выполняет три метода:
- a = Method_A
- b = method_B
- c = Method_C(a,b)
Вычисления метода A и метода B полностью независимы. Метод C использует результаты методов A и B. В настоящее время методы выполняются последовательно. Чтобы повысить общую производительность IHttpHandler, моя идея состоит в том, чтобы вычислять методы A и B параллельно. Метод C следует запускать, если A и B завершили работу. Возможно ли это и как?
С уважением, Торстен
Ответ №1:
Конечно, это возможно; но самое интересное — выяснить, разумно ли это. Если работа привязана к процессору, то при небольшом количестве запросов она будет масштабироваться (например, это будет хорошо выглядеть на локальном компьютере только с вами) — однако, если есть много других параллельных запросов, то вы действительно можете снизить производительность (многопоточность имеет накладные расходы, и у вас естьконечные ядра).
Однако, если у вас мало запросов (т. Е. У вас достаточно ядер для параллельной обработки нагрузки без сбоев), или если работа в основном связана с вводом-выводом, все должно быть в порядке.
Просто запустите задачу для одного из элементов:
var task = new Task<ResultType>(() => Method_B());
task.Start();
var a = Method_A();
var b = task.Resu<
Method_C(a, b);
Обратите внимание, что это приводит к ряду связанных проблем — например, код в Method_B()
не будет иметь прямого доступа к какому-либо контексту, связанному с запросом. В идеале Method_B()
сначала соберите всю необходимую информацию (в основном потоке http-запроса) и передайте ее через простой тип данных, не связанный с http-контекстом. Аналогично, все, что использует локальные данные потока ( TransactionScope
например), не будет автоматически поступать в Method_B()
.
Ответ №2:
Вам нужно использовать TPL (библиотека параллельных задач). Проверьте по этой ссылке.
Ответ №3:
Это возможно и тривиально — либо с асинхронными расширениями, либо просто с постановкой в очередь рабочих элементов и использованием сигналов для синхронизации возврата. быть доступным.
Главный вопрос в том, имеет ли это смысл. Это имеет смысл только тогда, когда сервер все равно не занят вычислениями. Потому что, если это так — вы не можете волшебным образом создавать новые ядра процессора.