मुझे अधिसूचित होने का एक तरीका ढूंढने की आवश्यकता है जब एक सिस्टम.आईओ.पीपी.NamedPipeServerStream एसिंक्रोनस मोड में खोला गया है, उस पर पढ़ने के लिए अधिक डेटा उपलब्ध है- वेटहैंडल आदर्श होगा। मैं इस तरह के हैंडल प्राप्त करने के लिए बस BeginRead() का उपयोग नहीं कर सकता क्योंकि यह संभव है कि मुझे किसी अन्य थ्रेड द्वारा संकेत दिया जा सके जो पाइप को लिखना चाहता है- इसलिए मुझे पाइप पर लॉक जारी करना है और लेखन को पूरा करने की प्रतीक्षा है, और NamedPipeServerStream में CancelAsync विधि नहीं है। मैंने BeginRead() को कॉल करने का भी प्रयास किया, फिर पाइप पर Win32 फ़ंक्शन CancelIO को कॉल करने पर हस्ताक्षर किए जाने पर, लेकिन मुझे नहीं लगता कि यह एक आदर्श समाधान है क्योंकि अगर रद्द करने के लिए डेटा को आ रहा है और डेटा संसाधित हो रहा है, तो यह होगा गिरा दिया जाना चाहिए- मैं अभी भी इस डेटा को रखना चाहता हूं, लेकिन लिखने के बाद बाद में इसे संसाधित करता हूं। मुझे संदेह है कि Win32 फ़ंक्शन PeekNamedPipe उपयोगी हो सकता है लेकिन मैं इसके साथ नए डेटा के लिए निरंतर मतदान करने से बचना चाहता हूं।नामित पाइप्स - असिंक्रोनस पेकिंग
likley घटना है कि ऊपर पाठ थोड़ा स्पष्ट नहीं है, यहाँ मोटे तौर पर मैं ऐसा करने में सक्षम होना चाहते हैं क्या में ...
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: 0-बाइट का उपयोग ओवरलैप्ड I/O के साथ सिग्नल प्राप्त करने के तरीके के रूप में पढ़ता है जब डेटा किसी भी डेटा को पढ़ने के बिना लिखा जाता है, तो बहुत उपयोगी होता है, और दस्तावेज़ीकरण में स्पष्ट नहीं होता है। –