Task.Run
не совпадает с параллельным. Он берет новый поток из пула и запускает работу над этим потоком, и, поскольку вы этого не ожидаете, остальная часть кода может двигаться дальше. Тем не менее, это потому, что вы, по сути, осиротели в этой теме. Когда действие вернется, все сервисы с определенными областями будут удалены, включая такие вещи, как ваш контекст. Любые потоки, которые еще не завершены, в результате приведут к ошибке.
Пул потоков является ограниченным ресурсом, и в контексте веб-приложения он напрямую равен пропускной способности вашего сервера. Каждый поток, который вы берете, на один запрос меньше, который вы можете обслуживать. В результате вы с большей вероятностью попадете в очередь запросов, что только увеличит время обработки. Практически никогда не целесообразно использовать Task.Run
в веб-среде.
Кроме того, EF Core (или старый EF, в этом отношении) не поддерживает распараллеливание. Таким образом, даже без других проблем, описанных выше, это не даст вам холодно делать то, что вы пытаетесь сделать здесь, независимо от того.
Запросы, которые вы здесь задаете, не являются сложными. Даже если вы пытаетесь вставить сотни элементов одновременно, все равно это займет всего миллисекунды. Если здесь есть какая-либо значительная задержка, вам нужно сначала посмотреть ресурсы вашего сервера базы данных и задержки вашей сети.
Скорее всего, замедление происходит из-за отправки электронной почты. Впрочем, это тоже можно оптимизировать. Однажды я находился в ситуации, когда отправка писем занимала 30 секунд, пока я, наконец, не понял, что это проблема с нашим сервером Exchange, когда ИТ-администратор специально ввел 30-секундную задержку. Независимо от этого, как правило, всегда предпочтительнее фоновых вещей, таких как отправка электронных писем, так как они не являются основными для функциональности вашего приложения. Однако это означает, что фактически обрабатывает их в фоновом режиме, то есть ставит их в очередь и обрабатывает их с помощью чего-то вроде размещенной службы или совершенно другого рабочего процесса.