2012-11-13 4 views
5

के अंदर मुझे यह त्रुटि विंडोज सेवा में प्राप्त होती है। यह एक ही सेवा है कि मैं पहले से मेरे सवाल hereएपडोमेन को उतारने में त्रुटि। (HRESULT से अपवाद: 0x80131015), विंडोज सेवा

में चर्चा की है कोड Parallel.ForEach (मेरे अपने संस्करण के रूप में यह एक 3.5 खिड़कियों सेवा है) का उपयोग करने के लिए संशोधित किया गया है। समांतर उपयोग का कारण इस तथ्य से नीचे है कि प्रत्येक डोमेन को उतारने और उन्हें समानांतर में चलाने के लिए बहुत लंबा समय लगता है (यह प्रतीत होता है कि केवल एक थ्रेड है जो प्रत्येक अनलोड कर रहा है ?!)।

अन्य पदों के आधार पर, मैं केवल अनुमान लगा सकते हैं कि यह किसी भी तरह है नीचे इस तथ्य की ओर मैं एक ThreadPoolThreadUnload को AppDomain रों उपयोग कर रहा हूँ। मैं बस यह नहीं देख सकता कि इसे कैसे बचें?

public partial class SomeService : ServiceBase 
{ 
    private Manager _appDomainManager; 

    protected override void OnStop() 
    { 
     _appDomainManager.Dispose(); 
    } 
} 

public class Manager : IDisposable 
{ 
    public void Dispose() 
    { 
     Log.Debug("Disposing"); 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (_disposed) return; 
     if (disposing) 
     { 
      // dispose managed resources 
      Parallel.For(0, appdomains.Length, UnloadAppDomian); 
     } 

     _disposed = true; 
    } 
} 

private UnloadAppDomain(int appDomainIndex); 

public static class Parallel35 
{ 
    public static void For(int start, int end, Action<int> action) 
    { 
     var waitHandles = new WaitHandle[end - start]; 
     for (int j = 0; j < waitHandles.Length; j++) 
     { 
      waitHandles[j] = new ManualResetEvent(false); 
     } 

     for (int i = start; i < end; i++) 
     { 
      int i1 = i - start; 
      ThreadPool.QueueUserWorkItem(
       state => 
       { 
        try 
        { 
         action((int) state); 
        } 
        finally 
        { 
         ((ManualResetEvent) waitHandles[i1]).Set(); 
        } 
       }, i); 
     } 
     WaitHandle.WaitAll(waitHandles); 
    } 
} 
+0

क्या आपने थ्रेड विंडो का उपयोग करके यह ठीक होने पर यह देखने के लिए अपनी सेवा में डीबगर संलग्न करने का प्रयास किया है? वैसे, क्या आपने प्रत्येक AppDomain के लिए एक पृष्ठभूमि कार्य की बजाय एक ही पृष्ठभूमि कार्य में सभी AppDomains को अनलोड करने का प्रयास किया है? –

+0

@PanosRontogiannis समस्या तब थी जब मैंने इसे एक पृष्ठभूमि थ्रेड में चलाया था, इसे 'ऑनस्टॉप' के लिए बस इतना लंबा लगा। अभी भी समस्या के रूप में कुछ संदेह के साथ जांच। –

उत्तर

6

मैंने इसे AppDomain एस में से किसी एक को बग के रूप में ट्रैक किया है जो प्रतीक्षा प्रतीक्षा में इंतजार कर रहा है।

एक धागा गर्भपात नहीं करता है, उदाहरण के लिए यह अप्रबंधित कोड निष्पादित हो रहा है, या क्योंकि यह समय की अवधि एक CannotUnloadAppDomainException सूत्र में फेंक दिया जाता है कि मूल रूप से कहा जाता है के बाद एक अंत में ब्लॉक निष्पादित हो रहा है, तो है क्योंकि अनलोड।

AppDomain अब अपेक्षाकृत तेज़ी से उतारता है और मेरी सेवा बहुत जल्दी बंद हो जाती है।

+0

आपने इसे कैसे हल किया? – Naha

+0

इस पांच साल के पुराने संदेश के लिए धन्यवाद, मैंने दो विध्वंसक ब्लॉकों को अनावश्यक क्लीनअप दिनचर्या के साथ बदलकर अपना अपवाद हल किया, ताकि ऐपडॉमेन इसके साथ समाप्त होने के बाद अनलोड हो जाए, लेकिन वस्तुओं को नष्ट करने से पहले। –

1

कोशिश प्रत्येक AppDomain के लिए एक एकल पृष्ठभूमि कार्य के बजाय एक पृष्ठभूमि कार्य में सभी AppDomains उतारना और ServiceBase.RequestAdditionalTime का उपयोग करें ताकि एससीएम आपकी सेवा के रूप में उत्तरदायी नहीं निशान नहीं है।

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