2011-11-07 14 views
13

जो मैं कह सकता हूं उससे मुझे जानकारी के भ्रामक बिट्स हैं। मुझे पृष्ठभूमि में एक अलग थ्रेड चलाना होगा।कार्य का उपयोग करते समय एक नया धागा बनाया गया है। स्टार्टन्यू विधि

फिलहाल मैं इस तरह यह कार्य करें:

var task = Task.Factory.StartNew 
     (CheckFiles 
      , cancelCheckFile.Token 
      , TaskCreationOptions.LongRunning 
      , TaskScheduler.Default);//Check for files on another thread 

private void CheckFiles() 
{ 
    while (!cancelCheckFile.Token.IsCancellationRequested) 
    { 
     //do stuff 
    } 
} 

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

thQueueChecker = new Thread(new ThreadStart(CheckQueue)); 
thQueueChecker.IsBackground = true; 
thQueueChecker.Name = "CheckQueues" + DateTime.Now.Ticks.ToString(); 
thQueueChecker.Start(); 


private void CheckQueue() 
{ 
    while (!ProgramEnding) 
    { 
      //do stuff 
    } 
} 

आप सुझाव है कि मैं इस दृष्टिकोण एक नया धागा की गारंटी करने के लिए वापस जाने के लिए किया जाता है:

अतीत में मैं कुछ इस तरह किया है?

+0

'लॉन्ग राइजिंग' शेड्यूलर के लिए सिर्फ एक संकेत है - अगर आपको हमेशा एक नया थ्रेड होना चाहिए, तो आपको एक बनाना होगा। –

+0

फैंसी इसे एक उत्तर के रूप में जोड़ रहा है? – Jon

+0

धन्यवाद जॉन :) –

उत्तर

5

लॉन्ग राइजिंग शेड्यूलर के लिए सिर्फ एक संकेत है - अगर आपको हमेशा एक नया थ्रेड होना चाहिए, तो आपको एक बनाना होगा।

+1

मुझे लगता है कि यह सही जवाब है। मुझे कार्य का उपयोग करके धागे के अमूर्त पसंद हैं लेकिन कोई भी नया धागा गारंटी नहीं दे सकता है। हेनक का कहना है कि मुझे इसे ऐसा करने देना चाहिए जो मैं चाहता हूं लेकिन यह एक नए धागे की गारंटी नहीं देता है। – Jon

+0

क्या आपको लगता है कि हेनक की टिप्पणियां बताती हैं कि मैं गलत ट्रैक पर हूं, वैध हैं और यदि ऐसा है तो मैं – Jon

+0

और जानना चाहता हूं कि भ्रम "गारंटी" जैसे शब्दों के बारे में है। 'LongRunning' विकल्प कुछ भी करने के लिए" गारंटीकृत "नहीं है। हालांकि, .NET 4 में डिफ़ॉल्ट टास्कशेड्यूलर एक नया धागा बनाता है और यह * असंभव * बदलने के लिए है। कार्य का उपयोग करना एक अमूर्त है जो कोड को आसान बनाता है, लेकिन आप कुछ नियंत्रण खो देते हैं। यदि यह वास्तव में आपके लिए महत्वपूर्ण है, तो आप हमेशा एक कार्य शेड्यूलर लिख सकते हैं जो एक नए थ्रेड की गारंटी देता है और दोनों दुनिया में सर्वश्रेष्ठ है :) –

3

आपको क्यों निर्दिष्ट करना होगा आपको "हमेशा एक अलग थ्रेड की आवश्यकता है"।

void Main() 
{ 
    var task = Task.Factory.StartNew(CheckFiles, 
    cancelCheckFile.Token, 
    TaskCreationOptions.LongRunning, 
    TaskScheduler.Default); 

    task.Wait(); 
} 

एक स्मार्ट शेड्यूलर यहां 1 धागा का उपयोग करेगा। ऐसा क्यों नहीं होना चाहिए?


लेकिन सामान्य रूप में CheckFiles() विधि धागा (बुला से) दूसरे पर निष्पादित किया जाएगा। मुद्दा यह है कि क्या धागा विशेष रूप से बनाया गया है या क्या इसे कई धागे (उत्तराधिकार में) पर भी निष्पादित किया जा सकता है।

जब आप कार्य का उपयोग कर रहे हैं तो आप थ्रेड पर नियंत्रण छोड़ देते हैं। और यह एक अच्छी बात होनी चाहिए।

+0

मैं एक अलग थ्रेड को किसी अन्य थ्रेड पर फ़ाइल लिखने के लिए चाहता हूं ताकि कॉलिंग थ्रेड को जो भी चाहिए वह करने के लिए छोड़ दिया जाए। मैं एक और धागा एक सॉकेट द्वारा प्राप्त डेटा को संसाधित करना चाहता हूं। इन दोनों परिस्थितियों में डेटा को कतार में जोड़ा जाएगा और फिर अन्य चीजों को – Jon

+0

करने के लिए कॉलिंग थ्रेड को छोड़कर किसी अन्य थ्रेड पर डाला जाएगा, फिर शेड्यूलर ठीक वही करेगा जो आपको चाहिए यदि आप इसे केवल देते हैं। –

+0

लेकिन मैं इसकी गारंटी कैसे दे सकता हूं। आप कैसे जानते हैं कि शेड्यूलर मेरे लिए एक और थ्रेड पर ऐसा करेगा? दूसरी बात जो मैं निर्दिष्ट नहीं करता हूं और जो आप करते हैं वह कार्य है। रुको। जैसा कि मैं इसे किसी अन्य धागे पर चाहता हूं मैं प्रतीक्षा नहीं करता() – Jon

15

डिफ़ॉल्ट कार्य शेड्यूलर ThreadPoolTaskScheduler वास्तव में लंबे समय तक चलने वाले कार्य के लिए हमेशा एक नया धागा बना देता है। यह थ्रेड पूल का उपयोग नहीं करता जैसा आप देख सकते हैं। यह आपके द्वारा धागे बनाने के लिए मैन्युअल दृष्टिकोण के रूप में अलग नहीं है। सिद्धांत रूप में ऐसा हो सकता है कि .NET 4.5 का थ्रेड शेड्यूलर कुछ अलग करता है लेकिन व्यवहार में यह बदलने की संभावना नहीं है।

protected internal override void QueueTask(Task task) 
{  
    if ((task.Options & TaskCreationOptions.LongRunning) != TaskCreationOptions.None) 
    { 
    new Thread(s_longRunningThreadWork) { IsBackground = true }.Start(task); 
    } 
    else 
    { 
    bool forceGlobal = 
     (task.Options & TaskCreationOptions.PreferFairness) != TaskCreationOptions.None; 
    ThreadPool.UnsafeQueueCustomWorkItem(task, forceGlobal); 
    } 
} 
+3

मैं यह देखने में असफल रहा कि मेरे उत्तर में क्या गलत है। क्या आप बता सकते हैं कि डाउनवोट के लिए आपका तर्क क्या था? –

+3

@ रामहाउंड मुझे एहसास है कि यह प्राचीन है, लेकिन xp! = सही उत्तर। एलोइस सही है, 'थ्रेडपूल टास्कशेड्यूलर 'के लिए .NET Framework स्रोत कोड देखें -' QueueTask 'के नीचे दूसरी विधि: referencesource.microsoft.com/#mscorlib/system/threading/Tasks/ThreadPoolTaskScheduler.cs कोड में भी एक टिप्पणी है: // अपने समर्पित धागे पर लंबे समय तक चलने वाले कार्यों को चलाएं। –

8

यह समयबद्धक आप उपयोग पर निर्भर करता है। दो स्टॉक कार्यान्वयन हैं, थ्रेडपूल टास्कशेड्यूलर और सिंक्रनाइज़ेशन कॉन्टेक्स्ट टास्कशेड्यूलर। उत्तरार्द्ध एक थ्रेड शुरू नहीं करता है, जिसे FromCurrentSynchronizationContext() विधि द्वारा उपयोग किया जाता है।

ThreadPoolTaskScheduler आपको मिलता है। जो वास्तव में LongRunning विकल्प का उपयोग करता है, यह सेट होने पर नियमित थ्रेड का उपयोग करेगा। अन्य टीपी धागे भूख से बचने के लिए महत्वपूर्ण है। आपको विकल्प के बिना एक टीपी धागा मिलेगा। ये कार्यान्वयन विवरण बिना किसी सूचना के बदल सकते हैं, हालांकि मैं इसे जल्द से जल्द असंभव मानता हूं।

+0

मुझे थ्रेडपूल टास्कशेड्यूलर साइट: msdn.microsoft.com -site: social.msdn.microsoft.com 'द्वारा या किसी सिंक्रनाइज़ेशन कॉन्टेक्स्ट टास्कशेड्यूलर साइट द्वारा खोजे गए किसी भी (ऑनलाइन एमएसडीएन आलेख) परिणाम क्यों नहीं मिल सकता है: msdn.microsoft.com -site: social .msdn.microsoft.com'? –

+1

क्योंकि वे आंतरिक कक्षाएं हैं। जैसा कि मैंने उल्लेख किया है, "कार्यान्वयन विवरण"। –

+0

धन्यवाद। क्या मैं पूछ सकता हूं कि "स्टॉक कार्यान्वयन" क्या है? –

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