Ist das folgende Muster von Multithreadaufrufen für ein .NET akzeptabel? FileStream ?
Mehrere Threads, die eine Methode wie diese aufrufen:
%Vor% Wo AcceptResults
ist:
Ich bin verwirrt, weil mir die Dokumentation unklar erscheint. Zum Beispiel sagt die FileStream-Klasse:
Alle öffentlichen statischen Member dieses Typs sind Thread-sicher. Alle Instanzmitglieder sind nicht garantiert threadsicher.
Aber die Dokumentation für BeginRead scheint zu erwägen, mehrere Leseanfragen im Flug zu haben:
Mehrere gleichzeitige asynchrone Anforderungen machen die Reihenfolge der Anforderungsabschlüsse unsicher.
Darf man mehrere Lesevorgänge im Flug haben oder nicht? Schreibt? Ist dies der geeignete Weg, den Speicherort des Position
des Streams zwischen dem Aufruf von Seek und dem Aufruf von BeginRead
zu sichern? Oder muss diese Sperre bis zum EndRead
gehalten werden, daher kann nur jeweils ein Flug im Flug gelesen oder geschrieben werden?
Ich verstehe, dass der Rückruf in einem anderen Thread stattfinden wird, und meine Behandlung von state
, buffer
behandelt das auf eine Weise, die mehrere Lesevorgänge im Flug erlauben würde.
Weist jemand weiter, wo in der Dokumentation die Antworten auf diese Fragen zu finden sind? Oder ein Artikel von jemandem, der Bescheid weiß? Ich habe gesucht und kann nichts finden.
Relevante Dokumentation:
FileStream-Klasse
Suchmethode
BeginRead-Methode
EndRead
IAsyncResult-Schnittstelle
Mit einigen neuen Informationen bearbeiten
Eine schnelle Überprüfung mit Reflector zeigt, dass BeginRead die Stream-Position in den Status pro Anruf einbindet (einige Felder der NativeOverlapped-Struktur). Es scheint, dass EndRead die Stream-Position nicht konsultiert, zumindest nicht in irgendeiner offensichtlichen Weise. Dies ist natürlich nicht schlüssig, weil es nicht naheliegend sein könnte oder von der zugrunde liegenden nativen API nicht unterstützt wird.
Ja, die Dokumentation ist skizzenhaft. Keine Ahnung für bessere Dokumente, leider.
EDIT: Tatsächlich hat Joe Duffys Buch Concurrent Programming on Windows Kapitel 8 APM, das die async API, IAsyncResult und so (gutes Buch und Autor) erklärt. Immer noch ist das grundlegende Problem hier, dass MSDN sagt, dass Instanzvariablen nicht Thread-sicher sind, daher die Notwendigkeit einer geeigneten Synchronisation.
Sie haben also mehrere Threads, die BeginRead für dieselbe Instanz von File starten? Auf der BeginRead-Seite wird dies jedoch erwähnt: "EndRead muss genau einmal für jeden Aufruf von BeginRead aufgerufen werden. Wenn ein Lesevorgang vor dem Beginn eines anderen Lesevorgangs nicht beendet wird, kann dies zu unerwünschtem Verhalten führen, z. B. Deadlock." Außerdem rufen Sie Seek auf dem File-Objekt auf, während andere Threads möglicherweise in der Mitte ihrer BeginRead-Rückrufe ausgeführt werden. Nicht sicher.
Tags und Links .net c# multithreading file-io filestream