Мне нужно выполнить обширные вставки данных в мою базу данных. Я могу реализовать код многопоточным способом с дросселированным планировщиком, который ограничивает количество параллельных операций. На каждом M
строках блок формируется и вводится в базу данных как атомная операция. Несколько параллельных операций должны происходить из-за того, что база данных работает медленнее, чем чтение и анализ файла данных. Я часто реализую эту модель с помощью многопоточности.Ограничение количества одновременных System.Threading.Tasks.Task
Если вместо этого я решил реализовать свой код, используя Await/асинхронный (Entity Framework поддерживает асинхронное программирование), как я могу убедиться, что не более чем N параллельных задач выполнения (т.е. перейти в базу данных), в то же время?
В моем первоначальном дизайне я создал экземпляр List<Task>
, добавив новые задачи, как только я прочитал блок данных, который нужно вставить атомарно, а затем позвольте моему методу вернуться после await
всей задачи. Проблема времени разработки заключается в том, что количество параллельных Task
s (и, следовательно, объем памяти) будет взорваться, потому что задачи будут загружаться быстрее, чем они завершаются для больших файлов данных.
Я думал об использовании SemaphoreSlim
, но у меня мало опыта с асинхронным программированием (в отличие от многопоточного). Поэтому я задаю этот вопрос, чтобы получить отзывы о лучших практиках, если они есть.
Я определенно думаю, что 'SemaphoreSlim' это путь в этом случае , если вы хотите запустить ограниченное количество нескольких потоков. – Gertsen
Поскольку ваша работа связана с IO, у вас нет необходимости в нескольких потоках. Вы можете выполнять несколько параллельных запросов БД без каких-либо дополнительных потоков. – Servy
[Здесь есть ограниченный планировщик задач параллелизма] (https://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler%28v=vs.110%29.aspx?f=255&MSPPError=- 2147217396) (прокрутите немного вниз для реализации). –