Tworzę usługę Windows, która korzysta z FileSystemWatcher do monitorowania określonego folderu w celu dodania określonego typu pliku. Ze względu na lukę między utworzonym zdarzeniem, a plikiem, który jest faktycznie gotowy do manipulacji, utworzyłem kod Queue<T>
do przechowywania nazw plików wymagających przetworzenia. W module obsługi zdarzeń Utworzono element jest dodawany do kolejki. Następnie za pomocą timera okresowo chwytam pierwszy element z kolejki i przetwarzam go. Jeśli przetwarzanie nie powiedzie się, element zostanie dodany do kolejki, aby usługa mogła ponowić przetwarzanie później.Jak dodać element do początku kolejki?
To działa dobrze, ale odkryłem, że ma jeden efekt uboczny: pierwsza próba przetworzenia nowych elementów nie nastąpi, dopóki nie zostaną ponownie sprawdzone wszystkie stare elementy ponownej próby. Ponieważ jest możliwe, że kolejka może zawierać wiele elementów, chciałbym wymusić nowe pozycje na początku kolejki, aby były przetwarzane jako pierwsze. Ale z wersji Queue<T>
documentation nie ma oczywistego sposobu dodawania elementu z przodu kolejki.
Przypuszczam, że mógłbym utworzyć drugą kolejkę dla nowych przedmiotów i przetworzyć tę preferencję, ale mając jedną kolejkę, wydaje się prostszy.
Czy istnieje łatwy sposób dodania elementu do początku kolejki?
Jeśli dodajesz do przodu i do tyłu kolejki, przestaje być kolejką, pedantycznie rzecz biorąc. – CanSpice
dlaczego nie dodać elementów do ponownej próby do ich własnej kolekcji, aby później je przetworzyć? –
W STL używałbyś deque (które słyszałem, wymawiane jako "deck", ale naprawdę nie wiem). To podwójna kolejka. http://www.cplusplus.com/reference/stl/deque/ Nie wydaje się, że jest taki w System.Collections.Generic, ale możesz napisać własny w sposób, który opisujesz. –