Es gibt viele Beispiele für Code, wenn die folgende Konstruktion von Implementierungs-E/A-Operationen mit der Stream-Klasse verwendet wird. Wie folgt:Warum sollte eine neue Instanz von Stream pro E/A-Vorgang erstellt werden? (C#)
Wenn wir ReadFileBro aufrufen, erstellt es immer neue Eigenschaften von Stream-Beton-Implementierungen. Sobald die Operation wiederholt wird, werden die Einsen gelöscht.
Warum kann ich meinen StreamReader nicht einfach einmal erstellen und als Eigenschaft einer Klasse zur Multiplikation speichern?
Kürzlich habe ich eine kleine App für die Client-Server-Interaktion über SSH (mit [SSH.NET] [1]) bereitgestellt. Diese (vereinfacht) Code gearbeitet falsch:
class MyConnection
{
ShellStream myStream = client.CreateShellStream(...);//it represents Stream between client and server, create it as single instance for each calling SendCommand
void SendCommand(string command)
{
myStream.WriteLine(command);//send a command to server
string readed = null;
while (myStream.DataAvailable)
{
output = myStream.Read();//get data from server
}
}
}
jedoch dieser Code funktioniert gut:
class MyConnection
{
void SendCommand(string command)
{
myStream.WriteLine(command);
using(var myStream = client.client.CreateShellStream(...))
{ /* get data from server */ }
}
}
Wie konnte das passieren?
In der SSH.NET-Bibliothek befindet sich die ShellStream-Klasse (Client-Server-Änderungsdaten). Diese Klasse weist eine Eigenschaft auf, die ein Ereignis darstellt, das ausgelöst wird, wenn eine neue Nachricht eintrifft. Wenn Dispose() der Instanz von ShellStream aufgerufen wird, können meine Handler dieses Ereignis nicht abonnieren. Kann ich die ShellStream-Instanz in diesem Szenario speichern? – Mergasov
ShellStream ist eine andere Implementierung als der allgemeinere Stream. In Ihrem Fall könnte die Implementierungsoption eine andere Option darstellen. Ich würde jedoch sehr empfehlen, wenn Sie es halten, sollten Sie auch IDisposable selbst implementieren –