2008-09-22 12 views
10

यदि उपयोगकर्ता निष्पादन में बाधा डालना चाहता है तो मुझे थ्रेड सिग्नल एक और होना चाहिए, हालांकि मुझे सिग्नलिंग/सिग्नल-चेकिंग तंत्र को कार्यान्वित करने के बारे में अनिश्चितता है। मैं अपनी परियोजना में एक सिंगलटन नहीं चाहता (जैसे वैश्विक bool), लेकिन क्या कोई विकल्प है?थ्रेड सिग्नल को .NET में एक और थ्रेड बनाने का सबसे अच्छा तरीका क्या है?

this thread में लोगों को कि सी ++ में के लिए उचित संरचनाओं का सुझाव है, लेकिन मैं नेट में इसी तरह कुछ के बारे में पता नहीं है। क्या कोई कृपया कुछ प्रकाश डाला सकता है?

उत्तर

7

BackgroundWorker बाहर की कोशिश करो। यह प्रगति अद्यतनों और एक चल रहे कार्य को रद्द करने का समर्थन करता है।

आप जब तक एक और धागा अपनी बात कर समाप्त हो गया है, तो Monitor.Wait और Monitor.Pulse अच्छे हैं, ManualResetEvent है के रूप में एक धागा इंतजार करना चाहते हैं। हालांकि, यह चल रहे कार्य को रद्द करने के लिए वास्तव में किसी भी उपयोग का नहीं है।

आप अपने खुद के रद्द कोड लिखना चाहते हैं, तो आप सिर्फ एक क्षेत्र कहीं जो दोनों धागे की पहुंच है हो सकता था। मार्क यह अस्थिर, उदा .:

private volatile bool cancelling; 

मुख्य थ्रेड सच के लिए सेट है, और कार्यकर्ता धागा समय-समय पर इसकी जांच करें और गलत पर सेट है, जब यह समाप्त हो गया है है।

यह वास्तव में एक 'वैश्विक चर' होने के रूप में आप अभी भी एक वर्ग के लिए निजी होने की सेमाफोर चर का दायरा सीमित कर सकते हैं करने के लिए तुलनीय नहीं है।

+0

मैं फ्रेमवर्क समाधान के साथ जाना पसंद करेंगे। एक सिंगलटन की तरह साझा var गंध नहीं है? जवाब के लिए धन्यवाद! –

+0

पृष्ठभूमिवर्कर ढांचे का हिस्सा है (2.0, मुझे विश्वास है)। मैं सहमत हूं कि एक साझा चर इस मुद्दे के लिए एक सुगंधित समाधान है। – Will

+0

ओह, नहीं, मैं वास्तव में बीडब्ल्यू दृष्टिकोण के साथ जाने के लिए इच्छुक हूं। अन-फ्रेमवर्क संदर्भ मेरे निजी नरक को लागू करने की दिशा में था :) –

-2

सिस्टम को देखें। रनटाइम। नेमस्पेस रीमोट करना।

+2

... और फिर चिल्लाओ भागो। – Will

+1

... और फिर आश्चर्य करें कि इसे आपके प्रश्न के साथ क्या करना है। –

5

एक अस्पष्ट (समय की कमी) सा है, लेकिन ManualResetEvent and AutoResetEvent पर गौर। आप भी मॉनीटर को देखना और लॉक करना चाहते हैं।

+0

इनके साथ समस्या यह है कि किसी को सेट करने के लिए प्रतीक्षा करनी होगी, या उनके लिए मतदान करना होगा। "मुख्य" थ्रेड बैठ नहीं सकता है, और मैं व्यस्त लूप, बैटरी बर्बाद करने, ऊर्जा लेने वाली, मतदान नहीं चाहता हूं। –

+0

वास्तव में ManualFesetEvent या WaitHandle (इसका आधार) उपयोग में प्रतीक्षा करें WaitForSingleObject। सिग्नल आने तक आपका धागा निलंबित कर दिया जाएगा। यह संदर्भ स्विचिंग पर कुछ चक्रों को बर्बाद करता है और ~ 100ms विलंबता है लेकिन धागे को संकेत दिए जाने तक कोई चक्र बर्बाद नहीं करेगा। ओह: क्षमा करें मुझे इसकी तारीख नहीं मिली। –

3

मॉनिटर में देखें। प्रतीक्षा करें और मॉनिटर.पल्स। .Net (बहुत पठनीय) में थ्रेडिंग पर एक उत्कृष्ट लेख दिया गया है: http://www.albahari.com/threading/part4.aspx

+0

मॉनीटर। प्रतीक्षा करें और मॉनिटर.पल्स वास्तव में रद्दीकरण परिदृश्य पर लागू नहीं हैं। –

+0

इनके साथ समस्या यह है कि किसी को सेट करने के लिए प्रतीक्षा करनी होगी, या उनके लिए मतदान करना होगा। "मुख्य" थ्रेड बैठ नहीं सकता है, और मैं व्यस्त लूप, बैटरी बर्बाद करने, ऊर्जा लेने वाली, मतदान नहीं चाहता हूं। –

1

सिंक्रनाइज़ किए गए स्थिर बूलियन की तरह एक साधारण समाधान, आपको एक ढांचे-आधारित समाधान के विपरीत होना चाहिए, जो आपके परिदृश्य के लिए अधिक मात्रा में हो सकता है । यदि आप अभी भी एक ढांचा चाहते हैं, तो विचारों के लिए parallel extensions to .NET पर एक नज़र डालें।

+0

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

+0

लेकिन "मुख्य" थ्रेड कैसे संकेत दिया गया है कि कुछ हुआ है? यह नहीं जानता कि एक बूलियन चर सेट किया गया है। –

+0

मुख्य धागे को बूलियन क्षेत्र में आम तौर पर एक लूप में मतदान करना होगा। –

1

यह इस बात पर निर्भर करता है कि आपको किस प्रकार की सिंक्रनाइज़ेशन की आवश्यकता है। यदि आप किसी प्रकार के निष्पादन तक पहुंचने तक थ्रेड में थ्रेड चलाने में सक्षम होना चाहते हैं - आपको बस एक स्थिर बूल चर है। यदि आप एक थ्रेड को प्रतीक्षा करना चाहते हैं तो एक और थ्रेड निष्पादन में एक बिंदु तक पहुंच जाए, तो आप WaitEvents (AutoResetEvent या ManualResetEvent) का उपयोग करना चाहेंगे। अगर आपको कई प्रतीक्षाों की प्रतीक्षा करने की आवश्यकता है, तो आप WaitHandle.WaitAll या WaitHandle.WaitAny का उपयोग कर सकते हैं।

+0

मेरे पास पहले से ही एक सूची है, कि मैं जांच सकता हूं कि इसमें शून्य से अधिक आइटम हैं या नहीं। समस्या मुख्य धागे को बता रही है कि सूची में शून्य से अधिक आइटम हैं, या वैकल्पिक रूप से एक बूलियन सेट किया गया है, या एक इवेंट, म्यूटेक्स, या सेमफोन सेट किया गया है। –

संबंधित मुद्दे