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
कार्य कार्रवाई करता है, तो इसके बारे में अपवाद शामिल सफल नहीं था)।
हम मतदान से नफरत क्यों करेंगे? –
क्या कोई घटना है जैसे ओनफिनलपॉशन आश्वस्त आप तक पहुंच सकते हैं? – Einer
आपको मतदान करने के लिए 'System.Threading.Timer' का उपयोग करना चाहिए - जो ऐसा करने के लिए एक नया धागा बनाने से बचाता है। –