Cuando no decimos utiliza hilos directamente, supongo que todavía desea utilizarlos indirectamente a través de llamadas asíncronas, de lo contrario esto no sería muy útil.
Todo lo que necesita hacer es ajustar los métodos asincrónicos del Stream
y almacenar el resultado en un búfer. En primer lugar, vamos a definir la parte de eventos de la especificación:
public delegate void MessageAvailableEventHandler(object sender,
MessageAvailableEventArgs e);
public class MessageAvailableEventArgs : EventArgs
{
public MessageAvailableEventArgs(int messageSize) : base()
{
this.MessageSize = messageSize;
}
public int MessageSize { get; private set; }
}
Ahora, lea un entero de 16 bits de la corriente de forma asíncrona e informar de vuelta cuando esté listo:
public class StreamWatcher
{
private readonly Stream stream;
private byte[] sizeBuffer = new byte[2];
public StreamWatcher(Stream stream)
{
if (stream == null)
throw new ArgumentNullException("stream");
this.stream = stream;
WatchNext();
}
protected void OnMessageAvailable(MessageAvailableEventArgs e)
{
var handler = MessageAvailable;
if (handler != null)
handler(this, e);
}
protected void WatchNext()
{
stream.BeginRead(sizeBuffer, 0, 2, new AsyncCallback(ReadCallback),
null);
}
private void ReadCallback(IAsyncResult ar)
{
int bytesRead = stream.EndRead(ar);
if (bytesRead != 2)
throw new InvalidOperationException("Invalid message header.");
int messageSize = sizeBuffer[1] << 8 + sizeBuffer[0];
OnMessageAvailable(new MessageAvailableEventArgs(messageSize));
WatchNext();
}
public event MessageAvailableEventHandler MessageAvailable;
}
Creo que eso es todo. Esto supone que cualquiera que sea la clase que maneje el mensaje también tiene acceso al Stream
y está preparado para leerlo, de forma síncrona o asincrónica, según el tamaño del mensaje en el evento. Si desea que la clase del observador realmente lea el mensaje completo, tendrá que agregar más código para hacerlo.
Dijo sin usar hilos !!! =) – Nayan
@Nayan: Asynchrony * es * multithreading. Este problema es inherentemente uno de multihilo. Sospecho que lo que significa OP es que no quiere crear los hilos por sí mismo. –
@Nayan: Supongo que el OP está buscando una solución que no cree explícitamente un nuevo subproceso y utilice el método de bloqueo de lectura, pero para una solución asincrónica sin bloqueo. No puede tener asincronicidad sin hilos. – dtb