2014-04-28 14 views
14

मैं एक सॉफ्टवेयर/हार्डवेयर इंजीनियर हूं जिसमें सी और एम्बेडेड प्रौद्योगिकियों में काफी कुछ अनुभव है। वर्तमान में मैं सी # (.NET) में कुछ एप्लिकेशन लिखने में व्यस्त हूं जो डेटा अधिग्रहण के लिए हार्डवेयर का उपयोग कर रहा है। अब निम्नलिखित, मुझे जलने के लिए, प्रश्न:सही तरीके से मतदान?

उदाहरण के लिए: मैं एक मशीन एक धुरी की अंतिम स्थिति का पता लगाने के लिए एक endswitch है कि है। अब मैं डेटा पढ़ने के लिए एक यूएसबी डेटा अधिग्रहण मॉड्यूल का उपयोग कर रहा हूँ। वर्तमान में मैं पोर्ट-स्टेटस को लगातार पढ़ने के लिए थ्रेड का उपयोग कर रहा हूं।

इस डिवाइस पर कोई बाधा नहीं है।

मेरा प्रश्न: क्या यह सही तरीका है? क्या मुझे टाइमर, धागे या कार्य का उपयोग करना चाहिए? मुझे पता है कि मतदान कुछ ऐसा है जो आप में से अधिकांश लोग "नफरत करते हैं", लेकिन किसी भी सुझाव का स्वागत है!

+6

हम मतदान से नफरत क्यों करेंगे? –

+0

क्या कोई घटना है जैसे ओनफिनलपॉशन आश्वस्त आप तक पहुंच सकते हैं? – Einer

+0

आपको मतदान करने के लिए 'System.Threading.Timer' का उपयोग करना चाहिए - जो ऐसा करने के लिए एक नया धागा बनाने से बचाता है। –

उत्तर

33

IMO, यह भारी अपने सटीक वातावरण पर निर्भर करता है, लेकिन पहले बंद - आप ज्यादातर मामलों में अब और धागे का उपयोग नहीं करना चाहिए। Tasks इसके लिए अधिक सुविधाजनक और अधिक शक्तिशाली समाधान हैं।

  • कम मतदान आवृत्ति: Tick घटना में टाइमर + मतदान:
    एक टाइमर संभालने के लिए और बंद करने के लिए आसान है। के बारे में धागे/पृष्ठभूमि में चल रहे कार्यों में चिंता करने की कोई ज़रूरत नहीं है, लेकिन से निपटने मुख्य थ्रेड में होता है

  • मध्यम मतदान आवृत्ति: Task + await Task.Delay(delay):
    await Task.Delay(delay) एक धागा पूल, बल्कि इसलिए की धागा ब्लॉक नहीं करता कम से कम देरी स्विचन संदर्भ ~ है 15ms

  • उच्च मतदान आवृत्ति: Task + Thread.Sleep(delay)
    1ms देरी पर प्रयोग करने योग्य - हम वास्तव में यह हमारे यूएसबी माप उपकरण सर्वेक्षण करना है

यह इस प्रकार लागू किया जा सकता:

int delay = 1; 
var cancellationTokenSource = new CancellationTokenSource(); 
var token = cancellationTokenSource.Token; 
var listener = Task.Factory.StartNew(() => 
{ 
    while (true) 
    { 
     // poll hardware 

     Thread.Sleep(delay); 
     if (token.IsCancellationRequested) 
      break; 
    } 

    // cleanup, e.g. close connection 
}, token, TaskCreationOptions.LongRunning, TaskScheduler.Default); 

ज्यादातर मामलों में आप सिर्फ Task.Run(() => DoWork(), token) उपयोग कर सकते हैं, लेकिन वहाँ TaskCreationOptions.LongRunning विकल्प जो कार्य-अनुसूचक एक सामान्य thread- का उपयोग नहीं करने के लिए कहता है की आपूर्ति के लिए कोई अधिभार है पूल धागा
लेकिन जैसा कि आप देखते हैं Tasks को संभालने में आसान है (और await सक्षम है, लेकिन यहां लागू नहीं होता है)। विशेष रूप से "रोकना" कोड में कहीं से भी इस कार्यान्वयन में cancellationTokenSource.Cancel() पर कॉल कर रहा है।

तुम भी कई कार्यों में इस टोकन साझा करने और उन्हें एक ही बार में रोक सकता है। साथ ही, टोकन रद्द होने पर अभी तक कार्य शुरू नहीं किए गए हैं।

तुम भी एक कार्य के बाद चलाने के लिए एक कार्य के लिए एक और कार्रवाई संलग्न कर सकते हैं:

listener.ContinueWith(t => ShutDown(t)); 

यह तो श्रोता के बाद मार डाला जाता है पूरा करता है और आप सफाई कर सकते हैं (t.Exception कार्य कार्रवाई करता है, तो इसके बारे में अपवाद शामिल सफल नहीं था)।

+0

पर्यावरण विंडोज 8 के साथ एक टैबलेट है। आवेदन WPF है। अंतराल होना आवश्यक है उच्च, तो आप थ्रेड के साथ एक कार्य का उपयोग करने का सुझाव देंगे। नींद (देरी)? थ्रेड सही समाधान क्यों नहीं हैं? जानकारी के लिए धन्यवाद! – Velocity

+0

बढ़िया! आपके बहुत स्पष्ट उदाहरण और स्पष्टीकरण के लिए धन्यवाद! मुझे नहीं पता था कि कार्य का संदर्भ स्विचिंग। डेले लगभग 15ms था! फिर भी छोटा सवाल: थ्रेड सीधे क्यों हैं, इस मामले में कोई अच्छा समाधान नहीं है? थ्रेड-पूल की वजह से? – Velocity

+0

मेरी विस्तारित स्पष्टीकरण देखें, लेकिन थ्रेड प्रति खराब नहीं हैं से, लेकिन सिफारिश अब उन्हें (ज्यादातर मामलों में) का उपयोग नहीं करना है क्योंकि कार्य के लिए ओवरहेड न्यूनतम हैं, लेकिन "उपयोगिता लाभ" बड़े हैं ... – ChrFin

2

आईएमओ मतदान से बचा नहीं जा सकता है।

आप क्या कर सकते अपनी स्वतंत्र धागा/टास्क कि बंदरगाह नियमित रूप से मतदान होगा साथ, एक मॉड्यूल पैदा करते हैं।डेटा में बदलाव के आधार पर, यह मॉड्यूल उस घटना को उठाएगा जो उपभोग करने वाले अनुप्रयोगों द्वारा संभाला जाएगा

+0

यह भी एक अच्छा विचार है! लेकिन मॉड्यूल में स्वयं धागे या कार्य के दायरे से बाहर होते हैं? और परिवर्तन के बाद आप एक घटना आग? – Velocity

+0

क्षमा करें, आपने पहले से ही सुझाव दिया है! मैंने आपके जवाब को अनदेखा कर दिया है! ;) – Velocity

+0

मैं व्यक्तिगत रूप से कार्य (http://blog.slaks.net/2013-10-11/threads-vs-tasks/) का उपयोग करना चाहता हूं, लेकिन आम तौर पर यह काम की तात्कालिकता और आत्मविश्वास के स्तर पर निर्भर करता है पुस्तकालय –

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