मैं सोच रहा हूँ कि क्या dot.net 4 में नया टास्क क्लास एक पृष्ठभूमि या अग्रभूमि धागा बना रहा है?
आम तौर पर मैं थ्रेड पर "IsBackground" सेट करूँगा, लेकिन टास्क पर ऐसी कोई विशेषता नहीं है।
मैं MSDN पर इसका कोई भी दस्तावेज नहीं खोज पाया हूँ :-(
जवाबों:
सत्यापित करना कठिन नहीं होना चाहिए:
class Program
{
static void Main()
{
Task
.Factory
.StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
.Wait();
}
}
और जवाब है ...
ǝnɹʇ
यदि आप एक Task<T>
प्रयोग शुरू कर रहे हैं Task.Run()
, तो हाँ।
यदि आप उपयोग कर रहे हैं async
और await
, तो नहीं। यहाँ से अंश :
"Async और प्रतीक्षारत कीवर्ड अतिरिक्त थ्रेड बनाने का कारण नहीं बनते हैं। Async विधियों को मल्टीथ्रेडिंग की आवश्यकता नहीं है क्योंकि एक async विधि अपने स्वयं के थ्रेड पर नहीं चलती है। पद्धति वर्तमान सिंक्रनाइज़ेशन संदर्भ पर चलती है और थ्रेड पर समय का उपयोग करती है। केवल तभी जब यह विधि सक्रिय है। आप सीपीयू-बाउंड वर्क को एक बैकग्राउंड थ्रेड में स्थानांतरित करने के लिए टास्क का उपयोग कर सकते हैं। लेकिन एक बैकग्राउंड थ्रेड ऐसी प्रक्रिया से मदद नहीं करता है जो परिणाम उपलब्ध होने की प्रतीक्षा कर रहा है। "
कार्य थ्रेड द्वारा निष्पादित किए जाते हैं जो सिस्टम थ्रेड पूल से आ रहे हैं। थ्रेड पूल से आने वाले धागे को डिफ़ॉल्ट रूप से पृष्ठभूमि में निष्पादित किया जाता है।
यदि आप अभी तक किसी बैकग्राउंड टास्क के लिए आश्वस्त नहीं हैं, तो बस एक टास्क के भीतर से GUI एलिमेंट को एक्सेस करने का प्रयास करें:
public async Task<int> ProcessStuff_Async()
{
while(true)
{
label1.Text = "processing next item";
रन टाइम अपवाद प्राप्त करने के लिए:
क्रॉस-थ्रेड ऑपरेशन मान्य नहीं: नियंत्रण 'लेबल 1' उस थ्रेड के अलावा किसी थ्रेड से एक्सेस किया गया था जिस पर इसे बनाया गया था।
बस अच्छे पुराने नियमित पृष्ठभूमि के धागे की तरह।
MSDN डॉक्स में जानकारी है (2017 :-) तक, जैसे:
इसे संभालने का सबसे अच्छा तरीका ... एक बैकग्राउंड थ्रेड शुरू करना है जो टास्क का उपयोग करते हुए काम करता है। और इसके परिणाम का इंतजार करें । यह यूआई को सुचारू महसूस करने की अनुमति देगा क्योंकि काम किया जा रहा है।
इस डॉक में एक सेक्शन भी है What happens under the covers
।