मैं एक .NET Windows सेवा जो कुछ कार्रवाई करता है और रिपोर्ट तैयार करता बनाया है कारण बनता है। ये रिपोर्ट एक्सपीएस दस्तावेज हैं जिन्हें मैं एक निश्चित निर्देशिका में सहेजता हूं।एक एक्सपीएस फाइल करने के लिए एक FixedDocument सहेजा जा रहा है स्मृति रिसाव
डब्ल्यूपीएफ से परिचित होने के नाते, जिस तरह से मैंने रिपोर्ट बनाने के लिए चुना है, System.Windows.Documents.FixedDocument
को तत्काल करने के लिए FixedPage
ऑब्जेक्ट्स को त्वरित रूप से जोड़ना है।
मेरे समस्या यह है कि सेवा स्मृति के उपयोग के रूप में यह चलाता है समय के साथ और ऊपर और ऊपर जाता है।
सबसे पहले, मैं कड़ाई से मेरी कोड के माध्यम से चला गया, यह सुनिश्चित सभी डिस्पोजेबल वस्तुओं निपटाया गया आदि, और अन्य स्पष्ट स्मृति रिसाव उम्मीदवारों, लेकिन अभी भी समस्या थी। मैंने सेवा के स्मृति उपयोग को विस्तार से देखने के लिए सीएलआर प्रोफाइलर का उपयोग किया।
मैंने पाया कि सेवा इन FixedDocument
रिपोर्ट तैयार करता है, और उन्हें एक्सपीएस फ़ाइलें, FixedDocument
वस्तुओं (Dispatcher
, FixedPage
, UIElementCollection
, Visual
, आदि) स्मृति में रह रहे हैं के साथ जुड़े सभी विभिन्न UI तत्व के रूप में सहेज लेती है।
ऐसा प्रतीत नहीं होता है जब मैं अपने डब्ल्यूपीएफ ऐप्स में एक ही काम करता हूं, और इसलिए मेरा झुकाव यह है कि डब्ल्यूपीएफ यूआई डिस्पैचर मॉडल के साथ इसका उपयोग कुछ WPF ऐप के बाहर किया जा रहा है।
मैं अपने FixedDocument
वस्तुओं जब उन्हें एक सेवा इस तरह (या सामान्य रूप में एक WPF अनुप्रयोग के बाहर) में उपयोग करते हुए "निपटाने" कर सकते हैं?
======== संपादित =========
ठीक है, मैं पाया है कि मेरी स्मृति रिसाव विशेष रूप से बनाने/एक FixedDocument को आबाद करने के साथ क्या करना नहीं है। अगर मैं ऐसा करता हूं, लेकिन वास्तव में इसे एक्सपीएस के रूप में डिस्क पर सहेजता नहीं है, तो स्मृति रिसाव नहीं होता है। इसलिए, मेरी समस्या को एक्सपीएस फ़ाइल के रूप में सहेजने के साथ करना होगा।
यहाँ मेरी कोड है:
var paginator = myFixedDocument.DocumentPaginator;
var xpsDocument = new XpsDocument(filePath, FileAccess.Write);
var documentWriter = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
documentWriter.Write(paginator);
xpsDocument.Close();
मैं क्या कोशिश की है:
- मैनुअल कचरा संग्रहण
- के रूप में इस सवाल का जवाब में सुझाव यह paginator हो रही (पहले कॉलिंग
myFixedDocument
के प्रत्येक पृष्ठ परUpdateLayout()
नीचे) - मैं भीmyFixedDocument
Write()
यानी paginator नहीं में सीधे गुजर की कोशिश की है 0
- अपने स्वयं के सूत्र में कोड की उन पंक्तियों लाना और मैन्युअल रूप से नीचे बंद प्रेषक
फिर भी प्रयास विफल।
========== कारगर युक्तियाँ ==========
http://msdn.microsoft.com/en-us/library/system.appdomain.aspx पर सामान्य विधि उदाहरण में दिखाया गया का उपयोग कर अपने AppDomain में उपरोक्त कोड को अलग करके, मेमोरी रिसाव अब मेरी सेवा को प्रभावित नहीं करता है (मैं कहता हूं "अब प्रभावित नहीं होता है" क्योंकि यह अभी भी होता है, लेकिन जब ऐपडोमेन अनलोड हो जाता है, तो सभी लीक किए गए संसाधन इसके साथ अनलोड किए जाते हैं)।
मैं अभी भी एक वास्तविक समाधान को देखने के लिए उत्सुक हो जाएगा।
(एक संबंधित नोट पर, एक अलग ऐपडॉमेन का उपयोग करके दिलचस्पी रखने वालों के लिए पीडीएफशर्प घटक में एक स्मृति रिसाव का कारण बनता है, मैं कुछ एक्सपीएस फाइलों को पीडीएफ फाइलों में बदलने के लिए उपयोग कर रहा था। पीडीएफएसएचपी एक सामान्य फ़ॉन्ट कैश का उपयोग करता है जो सामान्य परिस्थितियों में महत्वपूर्ण रूप से बढ़ता नहीं है। लेकिन इन ऐपडोमेन्स का उपयोग करने के बाद कैश बढ़ रहा था और बढ़ रहा था। मैंने पीडीएफ सर्प स्रोत कोड संपादित किया ताकि मुझे समस्या को हल करने के लिए फ़ॉन्टडिस्क्रिप्टरस्टॉक और फ़ॉन्टडाटास्टॉक मैन्युअल रूप से साफ़ किया जा सके।)
===== ===== समाधान ==========
अंतिम समाधान के लिए नीचे मेरा उत्तर देखें।
जांच लगभग सटीक नकल: कि करने के लिए http://stackoverflow.com/questions/5883779/how-to-dispose-a-fixeddocument – Nat
अपुष्ट जवाब प्रश्न जीसी कचरा संग्रह को मजबूर करना है। जबकि मुझे यह एक स्वीकार्य समाधान नहीं लगता है, मैंने वैसे भी कोशिश की और यह मेरे लिए काम नहीं किया। फिर भी धन्यवाद। – Ross