2011-11-29 19 views
6

मेरे पास एक ऐसा एप्लिकेशन है जो कभी-कभी द्वितीयक धागे पर निगरानी कार्यों को चलाने के लिए टाइमर का उपयोग करता है। इनमें से कुछ क्लीनअप कार्यों में बहुत समय लगता है और जब मैं अपना प्रोग्राम प्रोग्राम समाप्त करता हूं तो मैं इन कार्यों को निरस्त करने में सक्षम होना चाहता हूं (अगर संभव हो तो कृपापूर्वक)।क्या मैं सिस्टम को रोक सकता हूं। थ्रेडिंग। टिमर

क्या थ्रेड.एबॉर्ट() के साथ प्रोग्राम के रूप में प्रोग्राम को थ्रेड करने का कोई तरीका है, या मुझे यह इंगित करने के लिए कोड में एक ध्वज जोड़ना होगा कि धागा समाप्त हो गया है और उसमें कुलीन स्थानों में इसकी जांच करें कोड जो टाइमर द्वारा शुरू किया गया है?

+0

ऐप को समाप्त करने से सभी धागे को समाप्त नहीं किया जाएगा? – CJ7

उत्तर

4

Thread जानने का कोई तरीका नहीं है जिस पर Threading.Timer कॉलबैक समय से पहले चला जाएगा। इसलिए इसे रद्द करने का कोई सामान्य तरीका नहीं है। यह संभव है कि कॉलबैक Thread इंस्टेंस को संवाद करे, लेकिन यह दो दौड़ की स्थिति खोलता है

नोट: सामान्य रूप से Abort का उपयोग करना एक बुरा अभ्यास है। यह डेडलॉक्स और/या संसाधन लीक का पता लगाने के लिए कठिन परिश्रम करने का एक काफी विश्वसनीय तरीका है। ऐसा लगता है कि CancellationToken

+0

फिर से, निरस्त करने की बीमारियों पर +1। –

5

एक निष्क्रिय तंत्र का उपयोग करने के लिए आप टाइमर बंद कर सकते हैं इससे पहले कि यह कॉलबैक है .change का उपयोग कर कार्यान्वित काफी बेहतर है, लेकिन एक बार कॉलबैक को क्रियान्वित करने शुरू होता है आप अपने कोड बाहर निकलने के लिए अनुमति देने के लिए एक आवेदन स्तर ध्वज का उपयोग करना चाहिए।

एक साइड नोट के रूप में, आपको thread.abort() का उपयोग नहीं करना चाहिए जबतक कि आप 100% सुनिश्चित नहीं हैं कि आप जानते हैं कि यह राज्य में छोड़ा जा रहा है। यह आपके एप्लिकेशन को अजीब तरीकों से गंभीर रूप से अस्थिर कर सकता है।

+0

+1 प्लेग की तरह थ्रेड.एबॉर्ट() से बचने के लिए ... वे टीपीएल में एबॉर्ट() को भी अनुमति नहीं देते हैं। –

1

क्या आप इन पंक्तियों के साथ कुछ मतलब है?

using System; 
using System.Threading ; 

class AppCore : IDisposable 
{ 
    Timer TimerInstance ; 
    string[] Args   ; 

    public AppCore(string[] args) 
    { 
     if (args == null) throw new ArgumentNullException("args") ; 
     this.TimerInstance = new Timer(Tick , null , new TimeSpan(0,0,30) , new TimeSpan(0,0,15)) ; 
     this.Args   = args ; 
     this.Cancelled  = false ; 
     this.Disposed  = false ; 
     return ; 
    } 

    public int Run() 
    { 
     // do something useful 
     return 0 ; 
    } 

    private bool Cancelled ; 
    public void Cancel() 
    { 
     lock(TimerInstance) 
     { 
      Cancelled = true ; 
      TimerInstance.Change(System.Threading.Timeout.Infinite , System.Threading.Timeout.Infinite) ; 
     } 
     return ; 
    } 

    private void Tick(object state) 
    { 
     if (!Cancelled) 
     { 
      // do something on each tick 
     } 
     return ; 
    } 

    private bool Disposed ; 
    public void Dispose() 
    { 
     lock (TimerInstance) 
     { 
      if (!Disposed) 
      { 
       using (WaitHandle handle = new EventWaitHandle(false , EventResetMode.ManualReset)) 
       { 
        TimerInstance.Dispose(handle) ; 
        handle.WaitOne() ; 
       } 
       Disposed = true ; 
      } 
     } 
     return ; 
    } 

} 
3

इसका उपयोग करें। टिमर। चेंज (टाइमआउट। अनंत, टाइमआउट। अनंत); पहले मैंने उपयोग किया है। विधि का प्रयोग करें लेकिन यह मेरे मामले में काम नहीं करता है इसलिए मैंने टाइमर.चेंज का उपयोग किया है।

यह मुझे सबसे अच्छा समाधान मिल गया है।

0
public void stopTimer(){ 
    myThreadingTimer = null; 
} 

स्पष्टीकरण: ऑब्जेक्ट को नष्ट करें = proccess को नष्ट करें।

+0

आम तौर पर, उत्तर अधिक उपयोगी होते हैं यदि उनमें कोड का क्या इरादा है, और यह दूसरों को पेश किए बिना समस्या का हल क्यों करता है, इसका स्पष्टीकरण शामिल है। (इस पोस्ट को कम से कम एक उपयोगकर्ता द्वारा ध्वजांकित किया गया था, संभवतः क्योंकि उन्होंने सोचा था कि स्पष्टीकरण के बिना उत्तर हटा दिया जाना चाहिए।) –

+0

स्पष्टीकरण: ऑब्जेक्ट को नष्ट करें = proccess को नष्ट करें। –

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