2010-08-22 17 views
11

बंद करता है तो मैं थ्रेड को कैसे रोकूं, मेरे पास एक सिंगलटन है जिसमें सर्वर से रिकॉर्ड्स प्राप्त करने के लिए चलने वाला थ्रेड है। लेकिन जब मैं अपने विनफॉर्म एप्लिकेशन को रोकता हूं तो थ्रेड चल रहा रहता है। मैंने थ्रेड को रोकने के लिए अपने सिंगलटन में एक विनाशक बनाने की कोशिश की है, लेकिन इसका धागा पर कोई प्रभाव नहीं पड़ता है - मुझे पता है कि विनाशक का विकास हो रहा है।जब मेरा विनफॉर्म एप्लिकेशन

मैं अपने आवेदन बंद होने पर मुझे थ्रेड बंद करने के तरीके के बारे में सुझावों की तलाश में हूं। धन्यवाद

सी #, .net2

+0

संभव डुप्लिकेट [? कैसे फार्म के समापन घटना पर BackgroundWorker को रोकने के लिए] (http://stackoverflow.com/questions/1731384/how-to-stop- पृष्ठभूमिवर्कर-ऑन-फॉर्म-क्लोजिंग-इवेंट) –

+0

मैंने आपके लिंक को देखा है ... यह मेरे लिए कोई काम नहीं करता – fishhead

उत्तर

9

सबसे अच्छा विकल्प है, अगर अपने आवेदन में संभव हो, सहकारी रद्द है।

एक थ्रेड स्वचालित रूप से बंद हो जाता है जब उसके पास निष्पादित करने के लिए कोई और कोड नहीं होता है। इसलिए, जब उपयोगकर्ता आपके एप्लिकेशन को बंद कर देता है, तो आप एक झंडा सेट करते हैं जो इंगित करता है कि आपका थ्रेड बंद होना चाहिए। थ्रेड को सेट करने पर थ्रेड को समय-समय पर जांचना होगा और यदि ऐसा है, तो सर्वर से रिकॉर्ड्स प्राप्त करना बंद करें और वापस आएं।

  • @ हंस पासेंट ने नोट किया, BackgroundWorker इस के लिए अंतर्निहित समर्थन है।
  • यदि आप अपग्रेड कर सकते हैं, तो .NET Framework 4.0 cooperative cancellation of asynchronous operations का समर्थन करने वाले नए वर्गों का एक पूरा सेट प्रस्तुत करता है।

अन्यथा, आप उदाहरण

static bool isCancellationRequested = false; 
static object gate = new object(); 

// request cancellation 
lock (gate) 
{ 
    isCancellationRequested = true; 
} 

// thread 
for (int i = 0; i < 100000; i++) 
{ 
    // simulating work 
    Thread.SpinWait(5000000); 

    lock (gate) 
    { 
     if (isCancellationRequested) 
     { 
      // perform cleanup if necessary 
      //... 
      // terminate the operation 
      break; 
     } 
    } 
} 
54

के लिए, अपने खुद के समाधान रोल कर सकते हैं एक धागा हो सकता है:

  • अग्रभूमि: जीवित अपने कार्यक्रमों रखेंगे जब तक यह खत्म है।
  • पृष्ठभूमि: जब आप अपना आवेदन बंद करते हैं तो समाप्त कर दिया जाएगा।

जब आप कोई धागा बनाते हैं, तो यह डिफ़ॉल्ट रूप से अग्रभूमि धागा होता है।

आपको लगता है कि इस तरह से बदल सकते हैं:

Thread t = new Thread(myAction); 
t.IsBackground = true; 
t.Start();
की
+0

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

+0

@ जेटी 9 मैंने अभी इसका परीक्षण किया है, एक बहु-फॉर्म अनुप्रयोग में एक फॉर्म बंद होने पर पृष्ठभूमि धागा समाप्त नहीं होता है। – tunafish24

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