In meinem Programm lese ich grundsätzlich in einer Datei, führe eine Verarbeitung durch und übergebe sie dann als Hauptspeicher an den Hauptspeicher, der von einem Streamreader verarbeitet wird. Dies wird alles von einer Klasse neben meiner Hauptperson gehandhabt.MemoryStream deaktiviert das Lesen nach der Rückgabe
Das Problem ist, wenn ich den Speicherstrom von meiner Methode in einer anderen Klasse zurückgibt, wird die Variable "Canread" auf false festgelegt und verursacht daher die Initialisierung des Streamreaders fehlschlagen.
Unten ist ein Beispiel für das Problem geschieht (wenn auch hier auf die Memorystream in der anderen Klasse Ich schreibe, aber es verursacht immer noch den gleichen Fehler, wenn ich es passieren zurück.
In der Klasse mit dem Namen " Other ":
public static MemoryStream ImportantStreamManipulator()
{
MemoryStream MemStream = new MemoryStream();
StreamWriter writer = new StreamWriter(MemStream);
using (writer)
{
//Code that writes stuff to the memorystream via streamwriter
return MemStream;
}
}
die Funktion ruft im Hauptprogramm:
MemoryStream MStream = Otherclass.ImportantStreamManipulator();
StreamReader reader = new StreamReader(MStream);
Wenn ich einen Haltepunkt setzen auf die‚Rückkehr MemStream‘, die‚CanRead‘Eigenschaft ist nach wie vor auf wahr gesetzt. Sobald ich so gehe, dass es zu meiner Hauptfunktion zurückkehrt und den zurückgegebenen Wert in MStream schreibt, wird die Eigenschaft "CanRead" auf false gesetzt. Dies verursacht dann eine Ausnahme in StreamReader, die besagt, dass MStream nicht gelesen werden konnte (wie die Eigenschaft angegeben wurde). Die Daten befinden sich im Stream-Puffer, wie es sein sollte, aber ich kann es einfach nicht rausbekommen.
Wie stelle ich es so ein, dass "CanRead" true meldet, sobald es an meine Hauptleitung zurückgegeben wird? Oder verstehe ich nicht, wie MemoryStream funktioniert und wie würde ich erreichen, was ich tun möchte?
Jon, was passiert, wenn 'writer' GC'd vor' stream' verwendet wird? –
@KevinBrock: Dann ist es nur Müll gesammelt, und alle gepufferten Daten sind verloren. 'StreamWriter' hat keinen Finalizer, AFAIK. –
Das war genau das. Ich dachte, dass die Rücksendung eine nicht-geschlossene Version aussenden würde, bevor die Verwendung den Streamwriter entsorgen würde. Ich denke, ich dachte, dass die Rückkehr eine Kopie des MemoryStream zurückgeben würde, keine Referenz aus irgendeinem Grund.Ich dachte auch, dass das Verlassen der ImportantStreamManipulator-Methode über eine Rückgabe automatisch den Streamwriter sowieso entsorgen würde, so dass ich nicht sicher war, dass dies möglich war. Wird der Streamwriter irgendwann später im Programm über den GC entsorgt, oder wird er erst entsorgt, wenn ich den MemoryStream entsorgt habe oder das Programm geschlossen habe? – Xantham