2015-02-11 8 views
5

मैं कुछ एसिंक्रोनस ऑपरेशंस कर रहा हूं और यदि मैं उदाहरण के लिए उपयोगकर्ता अनुरोध करता हूं तो एसिंक कार्य को रोकने से रोकने के लिए मैं रद्द करना टोकन का उपयोग करना चाहता हूं। ऐसा करने के लिए यह एक अच्छा अभ्यास है जिसमें एक शब्दकोश है जिसके साथ मैं सही ऑपरेशन को रोकने के लिए सही थ्रेड पा सकता हूं?रद्दीकरण टोकन स्रोत उदाहरण

public Dictionary<Thread, CancellationToken> CancellationTokenData; 

इस प्रकार, उपयोगकर्ता एक ऑपरेशन इसे सही ढंग से व्यवहार करना चाहिए अगर मैं गलत नहीं हूँ पर रद्दीकरण का अनुरोध करता है, तो: क्या मैं वर्तमान में देख रहा हूँ पीछा कर रहा है?

ऐसा करने के लिए सबसे अच्छे अभ्यास क्या हैं?

उदाहरण के लिए कहें कि उपयोगकर्ता थ्रेड {बी} का उपयोग कर डेटाबेस के अंदर एक सेट {ए} पर कुछ बहुत लम्बे ऑपरेशन निष्पादित करता है। फिर वह ऑपरेशन रद्द कर देता है और चला जाता है और दूसरे धागे से सेट {ए} पर एक और लंबा ऑपरेशन का उपयोग करता है। क्या मुझे वर्तमान CancellationToken के लिए वैश्विक चर का उपयोग करना चाहिए?

+0

मैं नहीं कह सकता कि मैं समझ रहा हूं कि आप क्या पूछ रहे हैं लेकिन रद्दीकरण बहुत सरल हैं और धागे का ट्रैक रखने का कोई कारण नहीं है। आप रद्दीकरण टोकनसोर्स बनाते हैं और किसी भी लंबे ऑपरेशन के लिए टोकन पास करते हैं, यानी कोई विधि जो रद्दीकरण टोकन स्वीकार करती है। क्लाइंट 'स्रोत' को निरस्त करने के लिए कहता है, स्रोत टोकन सिग्नल करता है, कोई भी * ऑपरेशन * जो मॉनीटर को गहराई से समाप्त करता है। यह ऑपरेशन/विधि है जो धागा नहीं, समाप्त होता है। कोई "वर्तमान" टोकन नहीं है, आप एक ही टोकन को कई परिचालनों में –

+0

@ पानागियोटिस कानावोस ओके में पास कर सकते हैं, लेकिन क्या आप इसे करने के लिए स्थानीय चर का उपयोग कर रहे हैं? अगर मैं स्थानीय का उपयोग कर रहा हूं तो मुझे बहुत बाधा आती है कि मैं इसे केवल कॉल कर सकता हूं वर्तमान विधि के अंदर, और यदि मैं इसे वैश्विक चर के रूप में उपयोग करता हूं तो चीजें गन्दा हो सकती हैं? क्या मेरे पास प्रत्येक के लिए एक वैश्विक होना चाहिए? मुझे आशा है कि हम एक ही ट्रैक पर हैं। – Hristo

+0

क्या मैं आपको सही समझता हूं कि धागे के बीच निर्भरताएं हैं? तो निश्चित रूप से आपको उनके लिए एक ही टोकन का उपयोग करना होगा - और एक शब्दकोश का उपयोग करने से कोई मतलब नहीं है ... –

उत्तर

15

आमतौर पर, आपके पास एक CancellationTokenSource प्रति ऑपरेशन है जो रद्द करने योग्य है। आप रद्दीकरण के बारे में जागरूक होने की आवश्यकता वाले सभी को ऑपरेशन (cts.Cancel()), और CancellationToken (cts.Token) को रद्द करने की आवश्यकता हो सकती है, जो सभी को रद्द करना टोकनसोर्स पास कर सकते हैं।

अमूर्तता के इस स्तर पर, आप धागे को नहीं रोकते हैं; आप संचालन बंद करो। धागे केवल कार्यान्वयन के विवरण हैं।

इसलिए, मुझे नहीं लगता कि टकनों को टोकन मैप करना अच्छा विचार है। यदि कार्य शामिल हैं, तो यह एक बहुत बुरा विचार है, क्योंकि इस बात की कोई गारंटी नहीं है कि प्रत्येक कार्य वास्तव में एक नए धागे पर चलता है।

+0

धागे के बीच कोई निर्भरता नहीं है, तो आप आमतौर पर ऑपरेशन के लिए रद्दीकरण को कैसे मानचित्रित करते हैं? – Hristo

+0

उदाहरण के लिए, मैं एक ऑपरेशन ए को निष्पादित करने से रोकना चाहता हूं और मेरे पास अन्य ऑपरेशन से अन्य 10 रद्दीकरण टोकन के साथ रद्दीकरण टोकन है। रद्दीकरण टोकन को निष्पादित करने वाले ऑपरेशन को जोड़ने का सही तरीका क्या है? – Hristo

+0

@ क्रिस आप नहीं करते हैं, यही बात है। आप पैरामीटर के रूप में विधि को * पास * करते हैं। विधियों या तो इसे जांचें जैसे प्रत्येक लूप चरण के बाद, या रद्द करने की घटना में एक ईवेंट हैंडलर को रद्दीकरण –

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