Как иметь список заполнения родительского объекта, в то время как дочерний объект использует список - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь реализовать модель, в которой родительский объект раскручивает новый дочерний объект со свойством List <>. Родитель будет добавлять элементы в список <>, в то время как дочерний элемент обрабатывает элементы в списке <>. Это будет асинхронно с родительским элементом, добавляющим элементы в разное время, в то время как дочерние элементы просто перемешивают элементы в List <> и затем бездействуют всякий раз, когда List <> исчерпан. Родителю не нужно ждать завершения дочернего метода, родитель просто вызывает дочерний метод, а затем ожидает поступления следующей информации для обновления List <> дочернего метода.

В идеале каждый ребенок должен сообщить родителю (обратный вызов), когда он слишком долго простаивал, чтобы родитель мог убить этого ребенка.

Чтобы оба метода обрабатывались одновременно, я понимаю, что каждый из них должен быть в отдельном потоке. Может быть, у кого-то есть пример кода, которым он может поделиться, чтобы направить меня в правильном направлении. Я только что наткнулся на новую (для меня) библиотеку System.Threading.Tasks.Parallel и изучаю ее.

Я знаю, что мог бы реализовать это как два отдельных процесса, каждый из которых работает в одной и той же очереди (таблица БД или что-то подобное), но я бы предпочел не идти по этому пути, если это просто невозможно сделать с помощью C # и отдельных потоков. .

ОБНОВЛЕНИЕ : Из ответа Рахула я нашел эту статью, которая была очень полезна на нескольких примерах: Обзор BlockingCollection

ОБНОВЛЕНИЕ : Эта статья о вариациях задачи также была полезна для понимания управления потоками: Обзор задачи

1 Ответ

0 голосов
/ 28 апреля 2018

Вы говорите о шаблоне потребителя производителя , и в этом случае вы можете использовать BlockingCollection<T>, который является реализацией такого. Цитирование со связанной страницы документа

BlockingCollection<T> - это потокобезопасный класс коллекции, который обеспечивает следующее:

Реализация модели производитель / потребитель; BlockingCollection - это оболочка для Интерфейс IProducerConsumerCollection.

...