पूरा करता है मैं प्रारंभ/अंत शैली विधियों का उपयोग कर कुछ एसिंक्रोनस नेटवर्क I/O कर रहा हूं। (यह वास्तव में एज़ूर टेबल स्टोरेज के खिलाफ एक प्रश्न है, लेकिन मुझे लगता है कि यह महत्वपूर्ण नहीं है।) मैंने ThreadPool.RegisterWaitForSingleObject()
का उपयोग कर क्लाइंट साइड टाइमआउट लागू किया है। जहां तक मैं कह सकता हूं यह ठीक काम कर रहा है।सी #: पंजीकरण WaitForSingleObject का उपयोग करते हुए यदि ऑपरेशन पहले
क्योंकि ThreadPool.RegisterWaitForSingleObject()
एक तर्क के रूप में WaitHandle
लेता है, मुझे I/O ऑपरेशन शुरू करना है, फिर ThreadPool.RegisterWaitForSingleObject()
निष्पादित करें। ऐसा लगता है कि इस संभावना को प्रस्तुत करता है कि I/O पूरा होने से पहले मैं पूरा करता हूं।
एक सरलीकृत कोड नमूना:
private void RunQuery(QueryState queryState)
{
//Start I/O operation
IAsyncResult asyncResult = queryState.Query.BeginExecuteSegmented(NoopAsyncCallback, queryState);
//What if the I/O operation completes here?
queryState.TimeoutWaitHandle = ThreadPool.RegisterWaitForSingleObject(asyncResult.AsyncWaitHandle, QuerySegmentCompleted, asyncResult, queryTimeout, true);
}
private void QuerySegmentCompleted(object opState, bool timedOut){
IAsyncResult asyncResult = opState as IAsyncResult;
QueryState state = asyncResult.AsyncState as QueryState;
//If the I/O completed quickly, could TimeoutWaitHandle could be null here?
//If so, what do I do about that?
state.TimeoutWaitHandle.Unregister(asyncResult.AsyncWaitHandle);
}
इस संभाल करने के लिए उचित तरीका क्या है? क्या मुझे अभी भी Unregister()
'AsyncWaitHandle में चिंता करने की ज़रूरत है? यदि हां, तो क्या इसे सेट करने के लिए प्रतीक्षा करने का एक आसान तरीका है?
क्या आपने मध्य में 'थ्रेड स्लीप' डालने का प्रयास किया है ताकि I/O ऑपरेशन को पूरा करने के लिए समय की अनुमति दी जा सके और देखें कि क्या होता है? – mellamokb
मैंने नहीं किया है। मुझे लगता है कि मैंने देखा है कि यह केवल 3-4 बार होता है, और फिर केवल भारी लोड उत्पादन मशीनों पर। मैं अपने असली कोड में स्लीप() कॉल जोड़ने शुरू नहीं करना चाहूंगा। –
पाठ्यक्रम के अपने विकास वातावरण में इसका परीक्षण करें। जब आप कहते हैं कि आपने देखा है कि यह केवल 3-4 बार होता है, तो आपने क्या देखा है? एक यादृच्छिक अस्पष्ट NullPointerException? – mellamokb