Приложение, которое я разрабатываю, составлено таким образом: Задача производителя сканировать файловую систему для текстовых файлов и помещать ссылку на них в мешок. Многие потребительские задачи принимают файлы refs из сумки одновременно и читают файлы (и делают короткую работу с их содержимым)Концепция «сумка задач» в C#, enqueue, пауза, отмена логических задач
Я должен быть в состоянии приостановить и возобновить весь процесс.
Я пробовал использовать TPL, создавая задачу для каждого файла ref, поскольку они помещаются в сумке (в этом случае сумка - это всего лишь концепция, производитель непосредственно создает потребительскую задачу при поиске файлов), но это Я не могу контролировать задачу, которую я создаю, я не могу (или я не знаю, как это сделать) их приостанавливать. Я могу написать некоторый код, чтобы приостановить поток, выполняющий в настоящее время задачу, но это разрушит точку работы с логическими задачами вместо manully создания потоков, не так ли? Я хотел бы, чтобы что-то вроде «задачи, уже назначенные на физическую нить, могут завершиться, но ожидание логических задач не должно начинаться до команды«
Как я могу добиться этого? Можно ли это сделать с помощью TPL или использовать другое?
EDIT: Ваши ответы действительны, но мое основное сомнение остается без ответа. Мы говорим о задачах, если я использую TPL, мой продюсер, и мой многопользователь будет задачами (правильно?), А не потоками (ну, нормально в момент выполнения задач будет отображаться по потокам). Каждый найденный механизм синхронизации (например, предложенный в комментарии «ManualResetEventSlim») работает на уровне потоков.
E.g. описание метода Wait() для «ManualResetEventSlim» означает «Блокирует текущий поток до тех пор, пока не будет установлен текущий ManualResetEventSlim».
Мое знание задачи чисто академическое, я не знаю, как все работает в «реальном мире», но мне кажется логичным, что мне нужен способ координации (wait/signal/...) задач в уровень задачи или вещи могут стать странными ... например ... две задачи могут быть сопоставлены в одном и том же потоке, но один должен был сигнализировать о другом, ожидающем затем тупике. Я немного смущен. Вот почему я спросил, может ли мое приложение использовать TPL вместо простых стилей старого стиля.
Да, вам придется создать механизм паузы самостоятельно. Использование, например, «ManualResetEventSlim», которые потребители многократно ждут, и что производитель устанавливает/сбрасывает для приостановки/возобновления. – Alex
Обычная 'Task' всегда выполняется в одном потоке. Поэтому любой примитив синхронизации, который работает на 'Thread', также работает с' Task'. – svick
@svick Что делать, если я запускаю 100 задач, которые выполняют тот же код, содержащий Wait()? основанный на принятом ответе на этот вопрос http://stackoverflow.com/questions/14515207/whats-the-proper-way-to-use-a-threadpool 100 ожидающий поток будет создан, это хорошо? – flagg19