.net - Best practice for continual running process in C# -


मैं सी # .NET में प्रोजेक्ट पर काम कर रहा हूं। NET Framework version 3.5।

My प्रोजेक्ट में एक फोकसर सीसी है जिसे एक भौतिक डिवाइस, एक दूरबीन केंद्र का प्रतिनिधित्व करता है, जो एक सीरियल (आरएस -232) पोर्ट के जरिए पीसी के साथ संवाद कर सकते हैं। मेरी कक्षा (फोकस) में वर्तमान स्थिति जैसे मौजूदा वर्तमान स्थिति, वर्तमान तापमान, ect है जो फ़ोकसर्स की वर्तमान परिस्थितियों का प्रतिनिधित्व करता है जो किसी भी समय बदल सकते हैं। इसलिए, मेरे फोकसर्स वर्ग को इन मूल्यों के लिए लगातार डिवाइस का चुनाव करने और अपने आंतरिक क्षेत्रों को अपडेट करने की आवश्यकता है। मेरा प्रश्न यह है कि इस लगातार मतदान अनुक्रम को करने का सबसे अच्छा तरीका क्या है? कभी-कभी, उपयोगकर्ता को डिवाइस को अलग-अलग मोड में स्विच करना पड़ता है, जिसमें मतदान रोकना, कुछ कार्रवाई करने और फिर मतदान शुरू करने की क्षमता की आवश्यकता होगी।

मेरा पहला प्रयास उस समय का उपयोग करना था, जो हर 500ms में टिक जाता है और फिर एक पृष्ठभूमि कार्यकर्ता को फोन करता है जो एक स्थिति के लिए चुनाव करता है और फिर एक तापमान देता है। जब टाइमर टिक्कार होता है कि पृष्ठभूमि कार्यकर्ता बीजू है तो यह बस वापस आता है और फिर 500ms बाद में कोशिश करता है। किसी ने सुझाव दिया है कि मैं पृष्ठभूमि कार्यकर्ता से सभी मिलकर छुटकारा पाता हूं और टाइमर टिक के आयोजन में सिर्फ चुनाव करता हूं। इसलिए मैंने टाइमर के ऑटोरसेट संपत्ति को गलत पर सेट किया और फिर हर बार एक चुनाव समाप्त होने पर टाइमर को पुनरारंभ करें। ये दो तकनीकों को मेरे आवेदन में सटीक तरीके से व्यवहार करना था, इसलिए मुझे यकीन नहीं है कि एक दूसरे से बेहतर है या नहीं। मैंने भी एक नया धागा बनाने का प्रयास किया, हर बार जब मैं एक नया थ्रेडस्टार्ट का उपयोग करके चुनाव अभियान करना चाहता हूं और वह सब कुछ यह भी ठीक काम करने के लिए लग रहा था

मुझे एक अन्य बात का उल्लेख करना चाहिए यह क्लास COM ऑब्जेक्ट सर्वर का एक हिस्सा है, जिसका मूल रूप से मतलब है कि क्लास लाइब्रेरी जो सीडी के जरिए तैयार की जाती है। मुझे यकीन नहीं है कि इसका उत्तर पर कोई प्रभाव है, लेकिन मुझे लगा कि मुझे इसे बाहर फेंक देना चाहिए।

इसका कारण यह है कि मैं यह सब पूछ रहा हूं कि मेरे सभी टेस्ट हेनेस रन और डीबग काम ठीक बनाता है, लेकिन जब मैं रिलीज़ बिल्ड करता हूं और एक अन्य एप्लिकेशन से मेरी क्लास को कॉल करने का प्रयास करता हूं, तो वह एप्लीकेशन फ्रीज हो जाता है और मुझे कारण का निर्धारण करने में एक कठिन समय आ रहा है

कोई भी सलाह, सुझाव, टिप्पणियों की सराहना की जाएगी।

धन्यवाद, जॉर्डन

यह याद रखें कि टाइमर अपने स्वयं के पृष्ठभूमि कार्यकर्ता थ्रेड को छुपाता है, जो मूल रूप से अंतराल के लिए सोता है, फिर उसके Elapsed ईवेंट को निकालता है। यह जानने के बाद, यह केवल उन्मूलन में मतदान करने के लिए समझ में आता है। धागा से धागा को शुरू करने के बजाय यह सबसे अच्छा अभ्यास आईएमओ होगा। आप टायमर को शुरू और बंद भी कर सकते हैं, इसलिए जो मोड स्विच करता है वह कोड टाईमर को रोक सकता है, कार्य को पूरा कर सकता है, फिर से शुरू करें (), और टाइमर को दूरबीन से पता नहीं चलना चाहिए IsBusy

हालांकि, मुझे ट्रैक करना चाहिए कि क्या बीत गए ईवेंट हैंडलर का एक अन्य उदाहरण अभी भी चल रहा है या नहीं। आप Elapsed हैंडलर के कोड को लॉक कर सकते हैं, या आप एक झंडे सेट कर सकते हैं, किसी भी धागे से दिखाई दे, जो इंगित करता है कि एक और बीत गए () इवेंट हैंडलर अभी भी काम कर रहा है; समाप्त हो चुके ईवेंट हैंडलर जो यह फ़्लैग सेट देखते हैं, तुरंत से बाहर निकल सकते हैं, सीरियल पोर्ट के साथ काम करने वाली concurrency समस्याओं से बचने।


Comments