क्या पृष्ठभूमि पृष्ठभूमि के रूप में कार्य बनाए जाते हैं?


85

मैं सोच रहा हूँ कि क्या dot.net 4 में नया टास्क क्लास एक पृष्ठभूमि या अग्रभूमि धागा बना रहा है?

आम तौर पर मैं थ्रेड पर "IsBackground" सेट करूँगा, लेकिन टास्क पर ऐसी कोई विशेषता नहीं है।

मैं MSDN पर इसका कोई भी दस्तावेज नहीं खोज पाया हूँ :-(

जवाबों:


119

सत्यापित करना कठिन नहीं होना चाहिए:

class Program
{
    static void Main()
    {
        Task
            .Factory
            .StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
            .Wait();
    }
}

और जवाब है ...

ǝnɹʇ


मुझे एक समस्या आ रही है जहाँ मेरे सभी कार्य कॉलिंग थ्रेड पर चल रहे हैं। मैंने अपनी परियोजना में ऊपर की उस सटीक रेखा को चिपकाया और यह "झूठी" रिपोर्ट करता है। क्या आप जानते हैं कि ऐसा क्यों हो सकता है? मैं .NET 4.0 का उपयोग कर रहा हूं।
ट्रेवर इलियट

8
इस थ्रेड के अनुसार stackoverflow.com/questions/7889746/… किसी कार्य को शुरू करते समय आपको बैकग्राउंड थ्रेड की गारंटी नहीं दी जाती है, लेकिन यदि आप टास्कक्रिएशनऑनलाइनों का उपयोग करते हैं तो आपको होना चाहिए। मैं उस विकल्प का उपयोग कर रहा हूं और यह अभी भी पृष्ठभूमि थ्रेड नहीं बना रहा है। क्या देता है?
ट्रेवर इलियट

इसे कॉन्फ़िगर नहीं किया जा सकता है?
रॉय नामी

2
मेरा मानना ​​है कि मुज़े की समस्या डिफ़ॉल्ट सिंक्रोनाइज़ेशन के संदर्भ में हो सकती है। यह निर्भर करता है कि आपके WinForms, WPF, Web या Console एप्लिकेशन में यह व्यवहार अलग-अलग हो सकता है क्योंकि इन सभी में समवर्ती कार्यों को निर्धारित करने के अलग-अलग तरीके हैं।
जिपर्सन

5
अपने जवाब से प्यार करें: "ǝnɹʇ"। बहुत मजेदार है। धन्यवाद।
टेडी

12

यदि आप एक Task<T>प्रयोग शुरू कर रहे हैं Task.Run(), तो हाँ।

यदि आप उपयोग कर रहे हैं asyncऔर await, तो नहीं। यहाँ से अंश :

"Async और प्रतीक्षारत कीवर्ड अतिरिक्त थ्रेड बनाने का कारण नहीं बनते हैं। Async विधियों को मल्टीथ्रेडिंग की आवश्यकता नहीं है क्योंकि एक async विधि अपने स्वयं के थ्रेड पर नहीं चलती है। पद्धति वर्तमान सिंक्रनाइज़ेशन संदर्भ पर चलती है और थ्रेड पर समय का उपयोग करती है। केवल तभी जब यह विधि सक्रिय है। आप सीपीयू-बाउंड वर्क को एक बैकग्राउंड थ्रेड में स्थानांतरित करने के लिए टास्क का उपयोग कर सकते हैं। लेकिन एक बैकग्राउंड थ्रेड ऐसी प्रक्रिया से मदद नहीं करता है जो परिणाम उपलब्ध होने की प्रतीक्षा कर रहा है। "


1
चूंकि आप टास्क का उपयोग कर रहे हैं। इसलिए यह बैकग्राउंड थ्रेड पर होगा, लेकिन अगर यह एक वाॅक को हिट करता है तो यह थ्रेड को पॉज करने और परिणामों की प्रतीक्षा करने के लिए कुछ विशेष कर सकता है। जांच करने लायक।
Steztric


0

कार्य थ्रेड द्वारा निष्पादित किए जाते हैं जो सिस्टम थ्रेड पूल से आ रहे हैं। थ्रेड पूल से आने वाले धागे को डिफ़ॉल्ट रूप से पृष्ठभूमि में निष्पादित किया जाता है।


-1

यदि आप अभी तक किसी बैकग्राउंड टास्क के लिए आश्वस्त नहीं हैं, तो बस एक टास्क के भीतर से GUI एलिमेंट को एक्सेस करने का प्रयास करें:

public async Task<int> ProcessStuff_Async()
{
    while(true)
    {
        label1.Text = "processing next item";

रन टाइम अपवाद प्राप्त करने के लिए:

क्रॉस-थ्रेड ऑपरेशन मान्य नहीं: नियंत्रण 'लेबल 1' उस थ्रेड के अलावा किसी थ्रेड से एक्सेस किया गया था जिस पर इसे बनाया गया था।

बस अच्छे पुराने नियमित पृष्ठभूमि के धागे की तरह।

MSDN डॉक्स में जानकारी है (2017 :-) तक, जैसे:

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

इस डॉक में एक सेक्शन भी है What happens under the covers


आपका चेक केवल पुष्टि करता है कि कार्य अपने स्वयं के धागे में चलता है, न कि यह कि धागा एक पृष्ठभूमि धागा है। एक बैकग्राउंड थ्रेड एक थ्रेड है, जो यदि अभी भी निष्पादित हो रहा है, तो प्रोग्राम को समाप्त होने से नहीं रोक सकेगा।
सॉरेन कुक्लाउ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.