читать, удалять и добавлять элемент в связанный список из разных тем - PullRequest
0 голосов
/ 08 февраля 2012

Какая практика программирования лучше всего подходит для этого случая:

У меня есть связанный список с файловыми объектами, время от времени входящие файловые объекты добавляются в этот список ( AddThread ).

Эти файловые объекты должны быть "обработаны", предположительно, другим потоком ( ProcessThread ). Таким образом, всякий раз, когда файловые объекты добавляются в список, их необходимо обрабатывать по одному, в то время как другие файловые объекты все еще можно добавлять в список.

Во время обработки элемент из списка читается и впоследствии удаляется из этого списка. Обработка останавливается всякий раз, когда список пуст, и начинается при добавлении новых элементов.

Как я это вижу:

Всякий раз, когда к списку применяется изменение (элемент добавлен), инициируется событие изменения. Это событие вызывает ProcessThread . ProcessThreads блокирует список на короткое время для его чтения и снова снимает блокировку. Когда файл-объект обрабатывается, он снова блокирует его, чтобы быстро удалить элемент из списка и разблокировать его. Если в списке больше нет файловых объектов, ProcessThread устанавливается в спящий режим.

Это правильный способ сделать это, или есть другие лучшие варианты ..?

Приветс Даан

Редактировать : я использую связанный список, потому что тогда я могу добавить файл-объект в начало или конец списка, чтобы он обрабатывался до / после других. Обработка может занять до минуты, в зависимости от загрузки сети. Иногда происходит сбой, и его необходимо снова обработать.

Ответы [ 3 ]

1 голос
/ 08 февраля 2012

ОК, после прочтения других сообщений и обновлений, как насчет двух «простых» очередей (низкого и высокого приоритета), блокировки мьютекса / CS и семафора, составляющих очередь блокировки приоритетов?Чтобы добавить файл-объект, установите блокировку, поместите файл-объект в одну из очередей, снимите блокировку, подайте сигнал семафору.В process-thread / s дождитесь семафора, получите блокировку, TryTake из очереди с высоким приоритетом и, если это не получится, возьмите из очереди с низким приоритетом, затем снимите блокировку и обработайте файл-объект.

1 голос
/ 08 февраля 2012

может быть, вы хотите использовать BlockingCollection.http://msdn.microsoft.com/en-us/library/dd267312.aspx

* Если вы берете элемент из очереди, а очередь пуста, поток будет блокироваться, пока в ней что-то не окажется.

* Если вы добавите элемент в очередьи очередь заполнена, поток будет блокироваться, пока не будет места.

* Это потокобезопасно.

0 голосов
/ 08 февраля 2012

Если вы используете .net 4.0, я бы рассмотрел контейнер ConcurrentQueue .

Это обеспечивает вам потокобезопасный доступ к любому концу очереди объектов, вам не нужнобеспокоиться о реализации механизма блокировки.

Что касается запуска потока процесса, я бы рассматривал это как отдельную проблему.Событие звучит как правильный путь, основываясь на вашем описании, но то, будет ли решение с опросом или на основе событий наиболее подходящим, зависит от того, как часто очередь будет активироваться, насколько быстро процесс, насколько быстро реагирует система.,

Еще одна вещь.Почему бы вам просто не удалить файл-объект из списка, когда вы начинаете обработку?Есть ли вероятность, что обработка может завершиться неудачей, и вам нужно будет повторить попытку?Если вы оставите элемент в списке, есть ли вероятность, что вы сможете запустить 2 потока обработки и обработать его дважды?Невозможно сказать, основываясь на описании, но стоит рассмотреть.

...