Asenkron modda açılan bir System.IO.Pipe.NamedPipeServerStream açıldığında WaitHandle'ın ideal olması için daha fazla veriye sahip olduğunda bildirim almanın bir yolunu bulmalıyım. Böyle bir tutamaç elde etmek için sadece BeginRead() kullanamıyorum çünkü boruya yazmak istediğim başka bir iş parçacığı tarafından sinyallenebiliyor olabilirim - bu yüzden borudaki kilidi serbest bırakmak ve yazımın tamamlanmasını beklemek zorundayım. ve NamedPipeServerStream bir CancelAsync yöntemine sahip değildir. Ayrıca, BeginRead() 'i çağırmayı denedim, daha sonra iş parçacığının sinyal alması durumunda borunun üzerindeki win32 işlevini iptal etmeyi denedim, ama bunun ideal bir çözüm olduğunu düşünmüyorum çünkü eğer veriler gelmekte ve işlenmekte olduğu gibi CancelIO ise bırakılmam gerekirse - Bu verileri hala saklamak istiyorum, ancak yazının ardından daha sonra işlemek istiyorum. PeekNamedPipe'nın yararlı olabileceğinden şüpheleniyorum ama onunla sürekli olarak yeni veriler bulmaktan kaçınmak istiyorum. Yukarıdaki metin burada, biraz belirsizdir i yapabilmek istediğim şey kabaca olduğunu likley halinde Adlandırılmış Borular - Eşzamansız Peeking
...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: Verileri gerçekte hiç bir veri okumadan yazıldığı zaman bir sinyal almanın bir yolu olarak örtüşen G/Ç ile 0 bayt okumaların kullanılması çok yararlıdır ve belgelerde açıkça belirtilmemiştir. –