2011-03-06 17 views
64

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

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

मैं :-(

उत्तर

94

सत्यापित करने के लिए कठिन नहीं होना चाहिए MSDN पर इस में से किसी में दस्तावेज़ प्राप्त करने में सक्षम नहीं किया गया है:

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

और जवाब है ...

+2

+1 इस बारे में नहीं सोचा - अच्छा दृष्टिकोण :-) – Steffen

+0

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

+7

इस धागे के मुताबिक http://stackoverflow.com/questions/7889746/creating-threads-task-factory-startnew-vs- नया- कोई कार्य शुरू करते समय आपको पृष्ठभूमि थ्रेड की गारंटी नहीं है, लेकिन आपको होना चाहिए TaskCreationOptions.LongRunning का उपयोग करें। मैं उस विकल्प का उपयोग कर रहा हूं और यह अभी भी पृष्ठभूमि धागा नहीं बना रहा है। क्या देता है? –

5

यह एक पृष्ठभूमि धागा के रूप में चलाने के लिए प्रकट होता ǝnɹʇ।

इस देखें धागा:

Running multiple C# Task Async

3

आप एक Task<T> शुरू करने async और await कीवर्ड का उपयोग करने की बात कर रहे हैं, तो जवाब नहीं है। here से अंश:

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

+0

कार्य.रुन (async() => {....}) ??? इसके बारे में क्या, मैंने 'async' का उपयोग किया – deadManN

0

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

0

आप अभी तक एक पृष्ठभूमि कार्य के प्रति आश्वस्त नहीं हैं, वैसे ही जैसे एक टास्क के भीतर से एक जीयूआई तत्व तक पहुँचने का प्रयास:

क्रॉस:

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

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

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

वहाँ MSDN docs में जानकारी (2017 :-) के रूप में है, जैसे:

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

इस दस्तावेज़ में भी एक अनुभाग What happens under the covers है।

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