2009-11-06 3 views
11

शीर्षक को दोहराने के लिए सरल प्रश्न:क्या एप्लिकेशन बंद करना सभी सक्रिय पृष्ठभूमि कार्यकर्ताओं को रोकता है?

क्या WinForms एप्लिकेशन को बंद करना सभी सक्रिय पृष्ठभूमि कार्यकर्ताओं को रोकता है?

उत्तर

18

हां, यह करता है।

BackgroundWorker.RunWorkerAsync बस एक आंतरिक प्रतिनिधि पर BeginInvoke पर कॉल करता है, जो बदले में ThreadPool पर अनुरोध करता है। चूंकि सभी ThreadPool धागे background हैं, हां, यह समाप्त होने पर यह समाप्त हो जाएगा।

  1. द्वारा "WinForms अनुप्रयोग को बंद" मैं मुख्य Form उदाहरण (कि आम तौर पर एक Program कक्षा में Application.Run के लिए पारित किया है दृश्य द्वारा ऑटोजनरेटेड बंद करने मानते हुए हूँ:

    हालांकि, ध्यान रखें कि स्टूडियो)। यदि आपके पास पृष्ठभूमि कार्यकर्ता के साथ एक बाल विंडो है, तो यह स्वचालित रूप से BackgroundWorker को नहीं रोक पाएगी।

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

और जानकारी: Delegate.BeginInvoke, MSDN on Thread Pooling, Thread.IsBackground

0

यदि आवेदन पूरी तरह से बंद हो जाता है (जैसा कि कुछ भी बंद करने से इसे रोक रहा है) तो आपके पृष्ठभूमि कर्मचारी भी चले जाएंगे।

+3

यह एक गोलाकार उत्तर है। यदि ऐप बंद होने पर पृष्ठभूमि कार्यकर्ता स्वचालित रूप से बंद नहीं होते हैं, तो वे एप्लिकेशन को बंद होने से रोक देंगे। –

-1

मुझे लगता है हाँ। चूंकि धागे प्रक्रिया से जुड़े होते हैं और यदि प्रक्रिया बंद हो जाती है तो सभी धागे समाप्त हो जाते हैं।

0

प्रक्रिया समाप्त होने के बाद सभी संबंधित धागे भी चले गए हैं।

+0

सिवाय इसके कि उनकी 'IsBackground' संपत्ति' false' पर सेट है या नहीं। – Groo

+0

जो प्रक्रिया को समाप्त करने से रोक देगा। तो जवाब रखता है;) – dkackman

7

आपके मुख्य (UI) थ्रेड के बाद निष्पादन पर एक थ्रेड चलने का एकमात्र तरीका यह है कि यदि यह एक नया थ्रेड इंस्टेंस बनाकर और IsBackground को गलत पर सेट करके स्पष्ट रूप से बनाया गया है, तो यह एकमात्र तरीका है। यदि आप नहीं करते हैं (या यदि आप थ्रेडपूल का उपयोग करते हैं जो पृष्ठभूमि धागे को बढ़ाता है - या पृष्ठभूमिवर्कर जो आंतरिक रूप से थ्रेडपूल का भी उपयोग करता है) आपका धागा पृष्ठभूमि धागा होगा और मुख्य धागा समाप्त होने पर समाप्त कर दिया जाएगा।

जब एक प्रक्रिया बंद कर दिया है, इसके सूत्र के सभी समाप्त कर दिया है:

0

सबसे पहले, सिर्फ इस सवाल का जवाब आसान बनाने के लिए। इसके बारे में कोई सवाल नहीं है।

सवाल है, मैं यह व्याख्या के रूप में, इस प्रकार हो जाता है:

होगा अभी भी समय से चल रहे BackgroundWorker उदाहरणों को बंद करने से रोक?

का उत्तर प्रश्न है: नहीं, वे नहीं करेंगे।

1

हाँ, यह होगा। मैंने यह सरल रूप लिखा है, और फॉर्म को बंद करने से आवेदन निकलता है:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     this.backgroundWorker1.RunWorkerAsync(); 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     while (true) 
     { 
      Thread.Sleep(100); 
     } 
    } 
} 
संबंधित मुद्दे