Потоки, очередь и рабочий процесс - PullRequest
1 голос
/ 27 августа 2010

(Как оправдание - я никогда не работал с потоками, поэтому приведенное ниже описание - просто идея, которую я хочу, чтобы вы критиковали)

Обзор задачи:
- есть список некоторых объектов
- Нам нужно проверить, был ли объект каким-либо образом изменен
- Если оно было изменено - применить логику (например, показать уведомление).

Вот как я думаю, это должно быть реализовано:

Мы создаем таймер, срабатывающий каждую минуту, который пересекает список объектов и находит объекты, которые необходимо проверить. После этого мы добавляем этот объект (или, если быть точным, какой-то объект задачи, содержащий описание объекта и задачи: проверить, обновлялся ли он) в очередь.

Работник (какой-то поток в пуле потоков) ждет, пока что-то будет добавлено в очередь, а после того, как это произойдет, - берет задачу и обрабатывает ее: проверяет, был ли объект изменен. Если это так - это добавляет еще одну задачу, уведомление один. И теперь другой работник, который обрабатывает задачи уведомлений, при необходимости выполнит эту задачу.

Итак, это совершенно неверная идея? Что можно улучшить или изменить здесь?

UPD : согласно первому ответу: объект зависит от некоторого ресурса repote, а «изменение» означает, что некоторые удаленные данные изменились (или изменились каким-либо особым образом). Так что это не может быть решено с помощью INotifyPropertyChanged.

Ответы [ 2 ]

3 голосов
/ 27 августа 2010

Если эти «объекты» являются объектами .NET, зачем вам их опрашивать?Почему бы не реализовать что-то вроде интерфейса INotifyPropertyChanged и получить надлежащее, немедленное уведомление об изменениях?

В противном случае, если они на самом деле являются внешними объектами, которые могут только быть протестированыпутем опроса достаточно таймера, который запускает событие, которое затем опрашивает каждый объект и вызывает уведомление обратно в поток пользовательского интерфейса, или, если вы хотите, чтобы событие таймера завершилось быстро (например, чтобы оно могло немедленно ответить на другое событие)Выключите Task, чтобы проверить каждый объект и уведомить пользовательский интерфейс (используя Invoke), если он изменился.

Нет необходимости ставить в очередь каждый отдельный объект и обрабатывать их отдельно (есть ??), ни каких-либо требований для их параллельной обработки, поэтому простой цикл над ними в рабочем потоке (или Task) может показаться достаточным.

0 голосов
/ 27 августа 2010

Мне просто интересно, не могли бы вы рассмотреть очередь для ожидающих задач.Поэтому любые объекты задач, которые помещаются в эту очередь, ожидают обработки.В своем рабочем потоке вы блокируете очередь, пока элемент не станет доступным.Если вам нужен параллелизм, у вас может быть несколько рабочих потоков.

У вас также может быть список задач, показывающих выполняемые задачи, и другой список, показывающий, что они завершены.Я не программист на C #, но в Java я хотел бы использовать реализацию интерфейса BlockingQueue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...