Ich muss einen Weg finden, benachrichtigt zu werden, wenn ein System.IO.Pipe.NamedPipeServerStream, das im asynchronen Modus geöffnet wurde, mehr Daten zum Lesen hat - ein WaitHandle wäre ideal. Ich kann BeginRead() nicht einfach verwenden, um ein solches Handle zu erhalten, weil es möglich ist, dass ich von einem anderen Thread signalisiert werde, der in die Pipe schreiben will. Also muss ich die Sperre für die Pipe freigeben und warten, bis der Schreibvorgang abgeschlossen ist. und NamedPipeServerStream verfügt nicht über eine CancelAsync-Methode. Ich versuchte auch, BeginRead() aufzurufen, dann die win32-Funktion CancelIO auf der Pipe aufzurufen, wenn der Thread signalisiert wird, aber ich denke nicht, dass dies eine ideale Lösung ist, wenn CancelIO gerade aufgerufen wird, während Daten ankommen und verarbeitet werden fallen lassen - Ich möchte diese Daten noch behalten, aber zu einem späteren Zeitpunkt, nach dem Schreiben, verarbeiten. Ich vermute, dass die Win32-Funktion PeekNamedPipe nützlich sein könnte, aber ich möchte vermeiden, dass ich ständig nach neuen Daten damit suchen muss.Named Pipes - Asynchronous Peeking
Im likley Fall, dass der obige Text ein wenig unklar ist, ist hier in etwa, was i ...
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: Die Verwendung von 0-Byte-Lesevorgängen mit überlappenden E/A als Möglichkeit, ein Signal zu empfangen, wenn Daten geschrieben werden, ohne tatsächlich Daten zu lesen, ist sehr nützlich und in der Dokumentation nicht ersichtlich. –