WinRT Stream Write Api

In einem früheren Blog Artikel zu TCP/IP Socket Kommunikation mit C# oder VB.NET unter Windows 10 wurde folgendes Code Schnipsel verwendet um auf einer offenen Verbindung eines Servers eine Antwort an den Client zu senden.

   1:  Using raus As Stream = args.Socket.OutputStream.AsStreamForWrite()
   2:          Dim wr As StreamWriter = New StreamWriter(raus)
   3:          Await wr.WriteLineAsync("FILEOK") 
   4:          Await wr.FlushAsync()
   5:  'End Using

Args ist ein Objekt vom Typ StreamSocketListenerConnectionReceivedEventArgs und damit reinrassig aus der WinRT. Um den Typ für .net behandelbar zu machen, wird die Methode AsStreamForWrite verwendet.

Dieser Bruch hat mich unzufrieden zurück gelassen und ich habe versucht den Weg der API direkt zu nehmen. In der Tat hat IOutputStream eine Methode WriteAsync, die aber ein Objekt vom Typ IBuffer erwartet. Um zu vermeiden, das wir die Prozessgrenzen zwischen managed Code und dem COM Objekt überschreiten, wird eine Windows Funktion aus der Crypto API verwendet. Dieses Objekt bietet eine Methode um aus einer Zeichenkette ein Binary erstellen zu können. Da man das Encoding als Parameter angeben kann, klappt aber auch Zeichenkette. So sollte das Marshalling überflüssig werden.

   1:  Await args.Socket.OutputStream.WriteAsync(CryptographicBuffer.ConvertStringToBinary("FILEOK" +
Environment.NewLine, BinaryStringEncoding.Utf8))
   2:  Await args.Socket.OutputStream.FlushAsync()

Viele Code Beispiele wählen in solchen Szenarien den Weg über ein Byte Array, was zwar funktioniert und auch leicht zu debuggen ist, aber den Arbeitsspeicher der Laufzeitumgebung unnötig belastet. Überflüssig zu erwähnen das auch der Garbage Collector mehr Aufwand fürs aufräumen benötigen wird.

Kommentare sind geschlossen