Ho bisogno di trovare un modo per essere avvisato quando un System.IO.Pipe.NamedPipeServerStream aperto in modalità asincrona ha più dati disponibili per la lettura su di esso- un WaitHandle sarebbe l'ideale. Non posso semplicemente usare BeginRead() per ottenere un handle di questo tipo perché è possibile che io possa essere segnalato da un altro thread che vuole scrivere sulla pipe, quindi devo rilasciare il blocco sulla pipe e aspettare che la scrittura sia completa, e NamedPipeServerStream non ha un metodo CancelAsync. Ho anche provato a chiamare BeginRead(), quindi chiamando la funzione win32 CancelIO sulla pipe se il thread viene segnalato, ma non penso che questa sia una soluzione ideale perché se CancelIO viene chiamato proprio mentre i dati arrivano e vengono elaborati, essere lasciato cadere - desidero ancora conservare questi dati, ma elaborarli in un secondo momento, dopo la scrittura. Sospetto che la funzione win32 PeekNamedPipe potrebbe essere utile, ma mi piacerebbe evitare di dover continuamente eseguire il polling di nuovi dati con esso.Named Pipes - Peeking asincrono
Nel caso likley che il testo di cui sopra è un po 'poco chiaro, qui è più o meno quello che mi piacerebbe essere in grado di fare ...
NamedPipeServerStream pipe;
ManualResetEvent WriteFlag;
//initialise pipe
lock (pipe)
{
//I wish this method existed
WaitHandle NewDataHandle = pipe.GetDataAvailableWaithandle();
Waithandle[] BreakConditions = new Waithandle[2];
BreakConditions[0] = NewDataHandle;
BreakConditions[1] = WriteFlag;
int breakcode = WaitHandle.WaitAny(BreakConditions);
switch (breakcode)
{
case 0:
//do a read on the pipe
break;
case 1:
//break so that we release the lock on the pipe
break;
}
}
+1: l'utilizzo di letture a 0 byte con I/O sovrapposti come metodo per ricevere un segnale quando i dati vengono scritti senza leggere effettivamente alcun dato è molto utile e non è reso evidente nella documentazione. –