2012-01-03 18 views
6

मैं एक आवेदन है कि InvokeMember() तो जैसे के साथ अपने DLL का आह्वान किया है:सी # को मार डालो सभी धागे

Assembly OCA = Assembly.LoadFrom("./Modules/ProcessFiles.dll"); 
Type[] types = OCA.GetTypes(); 
foreach (var type in types) 
{ 
    //MethodInfo[] methods = type.GetMethods(); 
    if (type.Name == "Converter") 
    { 
     var tmpType = type; 
     var obj = Activator.CreateInstance(tmpType); 
     Thread t = new Thread(
      () => 
      tmpType.InvokeMember("Run", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, 
      null)); 
     t.Start(); 
     break; 
    } 

} 

मेरे DLL फिर नए एक धागा बनाता है और प्रसंस्करण शुरू होता है। मेरे डीएलएल में, मैं इस तरह का नया धागा बना देता हूं:

Thread thread = new Thread(
    delegate(){ 
     while(true) 
     { 
      GetFilesInFolder(); 
      Thread.Sleep(120000); 
     } 
    }); 
ne.Start(); 

लक्ष्य समय-समय पर फ़ोल्डर की जांच करना है। समस्या यह है कि जब मैं अपने डीएलएल को आमंत्रित करने वाले एप्लिकेशन को बंद करता हूं, तो प्रक्रिया बंद नहीं होती है। क्या सभी धागे को बंद करने का कोई तरीका है?

एनबी: मैं एप्लिकेशन को संशोधित नहीं कर सकता, मैं केवल अपने डीएलएल को संशोधित कर सकता हूं।

उत्तर

8

IsBackground धागे की संपत्ति true पर सेट करें। आपका ऐप खत्म होने पर यह थ्रेड को मार देगा।

इसके अलावा: आप एक टाइमर (या सिर्फ एक धागा) का उपयोग क्यों नहीं करते हैं, जो डेटा को जगाता है और निकाल देता है। यह अधिक संसाधन अनुकूल होना चाहिए।

+0

मैं टाइमर का उपयोग करने की कोशिश की थी, लेकिन मैं Threading.Timer काम करना आरंभ कर सके सुरक्षित रद्द लागू करने के बारे। – hs2d

+0

टाइमर भी हैं। टाइमर –

+0

हां, मुझे इसके बारे में पता है। हो सकता है कि आप मुझे एक कामकाजी उदाहरण दे सकें कि मेरी स्थिति में टाइमर का उपयोग कैसे करें? – hs2d

6

क्या आपने System.IO.FileSystemWatcher का उपयोग करने का प्रयास किया था? जब फ़ोल्डर में कुछ बदल जाता है तो यह ईवेंट फेंकता है। ऐसा लगता है कि यह आपके समाधान को सरल बना देगा।

+0

हां, मैं नई फाइलों और चेनेज के लिए 'फाइलसिस्टम वाटर' का उपयोग कर रहा हूं। लेकिन यह थोड़ा और अधिक compilcated। कुछ फाइलें बस संसाधित करने के लिए तैयार नहीं हैं और मुझे उन्हें उस फ़ोल्डर में छोड़ना है और बाद में उन पर जांच करना है। – hs2d

0

आप पृष्ठभूमि धागा ऊपर या टाइमर उल्लेख उपयोग कर सकते हैं:

Timer checkTimer; 
public void StartTimer() 
{ 
    checkTimer = new Timer(s => GetFilesInFolder(), null, 0, 120000); 
} 

मत भूलना यह निपटान करने के लिए।

1

कैसे से here

class RulyCanceler 
{ 
    object _cancelLocker = new object(); 
    bool _cancelRequest; 
    public bool IsCancellationRequested 
    { 
    get { lock (_cancelLocker) return _cancelRequest; } 
    } 

    public void Cancel() { lock (_cancelLocker) _cancelRequest = true; } 

    public void ThrowIfCancellationRequested() 
    { 
    if (IsCancellationRequested) throw new OperationCanceledException(); 
    } 
} 

टेस्ट

class Test 
{ 
    static void Main() 
    { 
    var canceler = new RulyCanceler(); 
    new Thread (() => { 
         try { Work (canceler); } 
         catch (OperationCanceledException) 
         { 
          Console.WriteLine ("Canceled!"); 
         } 
         }).Start(); 
    Thread.Sleep (1000); 
    canceler.Cancel();    // Safely cancel worker. 
    } 

    static void Work (RulyCanceler c) 
    { 
    while (true) 
    { 
     c.ThrowIfCancellationRequested(); 
     // ... 
     try  { OtherMethod (c); } 
     finally { /* any required cleanup */ } 
    } 
    } 

    static void OtherMethod (RulyCanceler c) 
    { 
    // Do stuff... 
    c.ThrowIfCancellationRequested(); 
    } 
} 
संबंधित मुद्दे