2013-05-09 7 views
6

Chciałbym przeczytać plik po otrzymaniu powiadomienia, że ​​pewna ilość danych została do niego zapisana przez inny wątek.

Moją pierwszą próbą było stworzenie Reaktywnego Przedmiotu w mojej klasie Writera, który wywołuje OnNext po zapisie do BinaryWriter, z którym się składa. Ten BinaryWriter używa FileStream.
To jednak nie działa. Zakładam, że nie mam gwarancji, że Zapis został spłukany.

Wolałbym nie ręcznie wywoływać flush. Czy istnieje sposób, aby to zrobić?Jak mogę wygenerować powiadomienia, że ​​dane zapisane przez FileStream znajdują się na dysku?

+4

Gratulujemy odpowiedzi na pytanie 5 000 000! – dasblinkenlight

+1

Czy [File Watcher] (http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx) pomaga? – Elias

+0

Czy nie ma nagrody dla tego, kto zadaje pytanie o numerze 5 000 000 lub następne 6 000 000 lub ...? Myślę, że on/ona powinien być wart 100 punktów reputacji. –

Odpowiedz

1

Na szerszym poziomie pytasz o komunikację między wątkami. Jest kilka sposobów radzenia sobie z tym w zależności od twoich preferencji i środowiska.

Jeśli jeszcze tego nie zrobiłeś, spójrz na wątki POSIX here i here. Zwróć uwagę na sekcje omawiające zmienne warunkowe lub semafory.

Architektura .NET ma bibliotekę System Threading, którą warto również przejrzeć. W szczególności ma zarówno semafor, jak i klasę monitora. Jeden lub drugi może być rozwiązaniem, którego potrzebujesz w tym przypadku.

Wreszcie, należy rozważyć interfejs i/lub zdarzenia InotifyPropertyChanged. W tym kontekście jest to alternatywna droga do sygnalizowania postępu od czytnika.

Ogólnie rzecz biorąc, zaleciłbym, aby wątek Twojego pisarza wyświetlał powiadomienie o zmianie zdarzenia lub wznosił semafor po zapisaniu X bajtów. Stamtąd czytelnik albo złapie wydarzenie, albo obejrzy semafor i podejmie odpowiednie działania.

Podejrzewam, że klasa monitora nie będzie dla ciebie tak przydatna, ponieważ blokowanie prawdopodobnie uniemożliwi równoczesny dostęp do pliku.

Powiązane problemy