Podczas zamki oparte wątek może rozwiązać ten problem, istnieje sposób, który działa na wątków, ale jest prawdopodobnie najlepiej stosować, gdy masz wiele procesów pisanie do końca pojedynczego pliku.
Aby uzyskać to zachowanie całej procesów (lub nitek też), określić, że chcesz Dołącz atomowy pisze do systemu operacyjnego, gdy uchwyty plików OS są tworzone. Odbywa się to poprzez określenie O_APPEND pod Posix (Linux, Unix) i FILE_APPEND_DATA w systemie Windows.
W języku C# nie zadzwonić lub system OS „open” „” CreateFile zwraca się bezpośrednio, ale istnieją sposoby, aby uzyskać ten wynik.
Zapytałem, jak to zrobić w Windows jakiś czas temu, a jeszcze dwie dobre odpowiedzi tutaj: How can I do an atomic write/append in C#, or how do I get files opened with the FILE_APPEND_DATA flag?
Zasadniczo, można użyć FileStream() lub PInvoke, chciałbym zaproponować FileStream() nad PInvoke z oczywistych względów .
Możesz użyć argumentów konstruktora do FileStream(), aby określić asynchroniczne operacje na plikach i we/wy oprócz flagi FileSystemRights.AppendData, która powinna zapewnić zarówno asynchroniczne operacje wejścia/wyjścia i zapisu atomowego do pliku.
Ostrzeżenie: Niektóre systemy operacyjne mają ograniczenia maksymalnej liczby bajtów, które mogą być zapisane w ten sposób w sposób atomowy, a przekroczenie tego progu spowoduje usunięcie obietnicy atomowej.
Z tego powodu, polecam pozostać przy zarządzaniu rywalizacją stylów lock(), starając się rozwiązać problem w ramach jednego procesu.
To nie wydaje się odpowiedzieć na pytanie, zagadnienie "bang bang together". –
Tak, w jaki sposób zapobiega się kolizji napadów asynchronicznych? –
W ten sam sposób radzimy sobie z rywalizacją o zasoby w systemie wielowątkowym. Blokady. ReadWriterLock (lub ReaderWriterLockSlim z 4.0/Parallel Extensions + 3.5) pozwala na równoczesne wielokrotne odczyty, więc jeśli jest to coś, co chcesz, użyj go. –