Quando non dici utilizzare le discussioni direttamente, presumo si vuole ancora li indirettamente utilizzare tramite le chiamate asincrone, altrimenti questo sarebbe non essere molto utile.
Tutto ciò che dovete fare è racchiudere i metodi asincroni dello Stream
e memorizzare il risultato in un buffer. In primo luogo, definiamo la parte all'evento della specifica:
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; }
}
Ora, leggere un intero a 16 bit dal flusso in modo asincrono e riferire quando è pronto:
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;
}
penso che su di esso. Ciò presuppone che qualsiasi classe stia gestendo il messaggio abbia anche accesso allo Stream
ed è pronto a leggerlo, in modo sincrono o asincrono, in base alla dimensione del messaggio nell'evento. Se vuoi che la classe watcher legga effettivamente l'intero messaggio, dovrai aggiungere altro codice per farlo.
Ha detto senza usare fili !!! =) – Nayan
@Nayan: Asynchrony * è * multithreading. Questo problema è intrinsecamente uno del multithreading. Sospetto che l'OP significhi che non vuole creare i thread in modo esplicito. –
@Nayan: Presumo che l'OP cerchi una soluzione che non crei esplicitamente una nuova discussione e utilizzi il metodo di lettura bloccante, ma per una soluzione asincrona non bloccante. Non puoi avere asincronia senza fili. – dtb