Я изучаю практичность некоторых новых параллельных функций в .NET 4.0.Параллельные функции .Net 4.0
Скажем, у меня есть код, например, так:
foreach (var item in myEnumerable)
myDatabase.Insert(item.ConvertToDatabase());
Представьте myDatabase.Insert выполняет какую-то работу, чтобы вставить в базу данных SQL.
Теоретически вы могли бы написать:
Parallel.ForEach(myEnumerable, item => myDatabase.Insert(item.ConvertToDatabase()));
И вы автоматически получаете код, который использует несколько ядер.
Но что делать, если myEnumerable может взаимодействовать только с одним потоком? Будет ли класс Parallel перечисляться одним потоком и только отправлять результат рабочим потокам в цикле?
Что делать, если myDatabase может взаимодействовать только с одним потоком? Разумеется, было бы не лучше сделать соединение с базой данных на итерацию цикла.
И наконец, что, если мой «элемент var» является UserControl или что-то, с чем необходимо взаимодействовать с потоком пользовательского интерфейса?
Какой шаблон проектирования следует использовать для решения этих проблем?
Мне кажется, что переход к Parallel/PLinq/etc не совсем прост, когда вы имеете дело с приложениями реального мира.
Лучший ответ на этот вопрос: скажем, мое тело цикла выполняет длительную операцию ввода-вывода (сетевой запрос, базу данных и т. Д.), Будет ли Parallel-класс обнаруживать спящие/приостановленные потоки и автоматически запускать новый? Или это будет ограничено количеством ядер на машине? – jonathanpeppers
@ Jonathan.Peppers: Планировщик задач по умолчанию справляется с этим довольно хорошо. Это добавит дополнительную работу в ситуацию. (По умолчанию ThreadPool использует гораздо больше элементов, чем потоки, и динамически масштабируется на основе рабочей нагрузки) –