2013-01-31 14 views
8

डिफ़ॉल्ट रूप से .NET में थ्रेड पूल पृष्ठभूमि धागे के साथ काम करता है।क्या मैं अपना थ्रेड पूल अपने धागे को अग्रभूमि के रूप में बना सकता हूं?

मैं इसे अग्रभूमि के रूप में चलाने के लिए नहीं बदल सकता।

मैं इसे अग्रभूमि धागे के रूप में चलाने के लिए कैसे बदलूं?

संपादित करें:

मैं क्योंकि मैं अपने अनुप्रयोग की वजह से उच्च मात्रा प्रसंस्करण बदल रहा हूँ (यह इससे पहले कि मैं मैन्युअल सूत्र, जो डिफ़ॉल्ट रूप से अग्रभूमि होते हैं निपटने गया था) इस का उपयोग करने की जरूरत है, और मैं नहीं करना चाहते मेरे आवेदन सिर्फ बदलने .. एक पृष्ठभूमि सूत्रण परिदृश्य के लिए यह अनुकूल करने के लिए

मैं सोच रहा हूँ क्यों थ्रेड पूल डिफ़ॉल्ट रूप से अग्रभूमि नहीं है

+3

क्या आप चाहते हैं कि वे आपकी प्रक्रिया को समाप्त करने से रोकने के लिए अग्रभूमि हों? आप संदर्भ संख्या को रख सकते हैं कि आपके द्वारा कितने सक्रिय पृष्ठभूमि थ्रेड आपके मुख्य (संभवतः अग्रभूमि, यूआई) थ्रेड को समाप्त नहीं करते हैं जब तक कि गणना शून्य तक न पहुंच जाए। –

+3

@jeffamaphone +1। जैसे "मुझे नहीं पता कि यह कैसे ठीक से प्रोग्राम करना है, इसलिए मैं एक हथौड़ा लेता हूं और किसी भी तरह से इसे काम कर रहा हूं, जो कुछ भी मुझे नहीं पता है उसका दुरुपयोग करते हैं"। – TomTom

+0

ठीक है, मैं बहुत ज्यादा नहीं मानना ​​चाहता हूं, लेकिन मैं ऐसे प्रश्नों को पसंद करता हूं जिनमें * क्यों * आप कुछ करना चाहते हैं, क्योंकि अक्सर अनुभव से आता है कि एक बेहतर तरीका है। –

उत्तर

16

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

यदि आप थ्रेड-पूल थ्रेड प्रोग्राम से बाहर निकलने के लिए चलाना चाहते हैं तो आप केवल संपत्ति को बदल सकते हैं। यह स्निपेट दिखाता है कि यह कैसे संभव है:

using System; 
using System.Threading; 

class Program { 
    static void Main(string[] args) { 
     var sync = new ManualResetEvent(false); 
     ThreadPool.QueueUserWorkItem((_) => { 
      Console.WriteLine("Running"); 
      Thread.CurrentThread.IsBackground = false; 
      sync.Set(); 
      Thread.Sleep(5000); 
      Console.WriteLine("Done, should exit now"); 
      Thread.Sleep(250); 
     }); 
     sync.WaitOne(); // Ensures IsBackground is set 
    } 
} 

अपनी आंखों को यहां गेंद पर रखें। यदि यह आपके लिए महत्वपूर्ण है तो एक उच्च संभावना है कि आप कुछ गलत कर रहे हैं।

0

मैं नहीं मानता कि आप, आप एक कस्टम साथ आने के लिए होगा कर सकते हैं ऐसा करने के लिए थ्रेडपूल।

प्रबंधित थ्रेड पूल में धागे पृष्ठभूमि धागे हैं। यही है, उनके IsBackground गुण सत्य हैं। इसका मतलब है कि एक थ्रेडपूल थ्रेड सभी अग्रभूमि धागे से बाहर निकलने के बाद चल रहे एप्लिकेशन को नहीं रखेगा।

जब नहीं थ्रेड का उपयोग करने के लिए पूल धागे

वहाँ कई परिदृश्य हैं जिसमें यह बनाने के लिए उचित है और थ्रेड पूल धागे का उपयोग कर अपने स्वयं के धागे का प्रबंधन करने के बजाय:

  • तुम एक की आवश्यकता होती है अग्रभूमि धागा

From this link And This One

2

आप थ्रेड पूल धागे को अग्रभूमि के रूप में सेट कर सकते हैं।

class Program 
{ 
    static void Main(string[] args) 
    { 
     new Action(() => Worker()).BeginInvoke(null,null); 

     Thread.Sleep(1000); 
     Console.WriteLine("Main ends here"); 
    } 

    static void Worker() 
    { 
     Thread.CurrentThread.IsBackground = false; 

     Console.WriteLine("Worker started. Bg {0} Tp {1}.", 
      Thread.CurrentThread.IsBackground, 
      Thread.CurrentThread.IsThreadPoolThread); 

     Thread.Sleep(5000); 
     Console.WriteLine("Worker ends here"); 
संबंधित मुद्दे