Domanda

ricevo l'eccezione seguente:

System.NotSupportedException : This stream does not support seek operations.
   at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin)
   at System.IO.BufferedStream.FlushRead()
   at System.IO.BufferedStream.WriteByte(Byte value)

Il legame spettacolo seguito che si tratta di un problema noto per Microsoft. http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback. aspx? FeedbackID = 273.186

Questa mostra stacktrace 2 cose:

  1. Lo System.IO.BufferedStream fare qualche operazione di spostamento del puntatore assurdo. Un BufferedStream dovrebbe tamponare il flusso sottostante e non più. La qualità di tampone sarà male se ci sono, quali le operazioni di ricerca.
  2. Non funzionerà mai stabile, con un torrente che non supporta Seek.

Esistono alternative? Non ho bisogno di un buffer insieme ad un NetworkStream in C # o si tratta già tamponato.

Modifica:. Voglio semplicemente ridurre il numero di lettura / scrittura chiamate al flusso socket sottostante

È stato utile?

Soluzione

La soluzione è quello di utilizzare due BufferedStreams indipendenti, uno per la ricezione e uno per l'invio. E non dimenticate di svuotare il BufferedStream invio in modo appropriato.


Dal momento che anche nel 2018 sembra difficile ottenere una risposta soddisfacente a questa domanda, per il bene dell'umanità, qui sono i miei due centesimi:

Il NetworkStream è tamponata sul lato operativo. Tuttavia, questo non significa che non esistono ragioni per tamponare sul lato NET. TCP si comporta bene su Write-Read (ripetizione), ma si arresta su Write-Write-Leggi causa di ritardo ACK, ecc, ecc.

Se, come me, avete un mazzo di sub-par codice del protocollo di prendere nel ventunesimo secolo, si vuole tamponare.

In alternativa , se si tiene fede a quanto sopra, si potrebbe anche tamponare legge solo / RCVS o scrive / invia solo, e utilizzare il NetworkStream direttamente per l'altro lato, a seconda di come rotto quale codice è . Devi solo essere coerenti!

Cosa BufferedStream Documenti non riescono a fare abbondantemente chiaro è che si dovrebbe solo interruttore lettura e la scrittura se il flusso è ricercabile . Questo perché tampona legge e scrive nello stesso tampone. BufferedStream semplicemente non funziona bene per NetworkStream.

Come Marc sottolineato, la causa di questo zoppia è la fusione di due corsi d'acqua in una NetworkStream che non è uno dei più grandi decisioni di progettazione di .net.

Altri suggerimenti

Il NetworkStream è già tamponata. Tutti i dati che vengono ricevuti sono conservati in un buffer in attesa di leggerlo. Le chiamate di leggere o sarà molto veloce, o bloccherà in attesa dei dati da ricevere dal altri peer sulla rete, un BufferedStream non aiuterà in entrambi i casi.

Se siete preoccupati per il blocco, allora si può guardare l'attivazione del sensore della presa sottostante alla modalità non-blocking.

A BufferedStream agisce semplicemente per ridurre il numero di chiamate di lettura / scrittura per il flusso sottostante (che può essere IO / hardware legato). Esso non può fornire cercano capacità (e, infatti, il buffering e la ricerca sono in molti modi contrariamente a vicenda).

Perché avete bisogno di cercare? Forse copiare il flusso a qualcosa seekable prima - un MemoryStream o un FileStream -. Poi fare il vostro lavoro effettivo da quel secondo, flusso seekable

Hai uno scopo specifico in mente? Io possa essere in grado di suggerire opzioni più appropriate per maggiori dettagli ...

In particolare: notare che NetworkStream è una curiosità - con maggior parte dei flussi, leggere / scrivere riguardano lo stesso flusso fisico; tuttavia, un NetworkStream rappresenta in realtà due tubi completamente indipendenti; leggere e scrivere sono completamente indipendenti. Allo stesso modo, non si può cercare in byte che sono già zip superare voi ... puoi Ignora di dati, ma che è meglio fatto facendo alcuni opdrations Read e scartando i dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top