मैं कभी-कभी बंद होने पर विंडो फॉर्म द्वारा फेंके गए ऑब्जेक्टडिस्पोज्ड एक्सेप्शन के साथ संघर्ष कर रहा हूं। मेरे क्लाइंट-सर्वर एप्लिकेशन में, क्लाइंट पर एक स्क्रीनशॉट कैप्चर किया जाता है और फिर सर्वर पर टीसीपी/आईपी के माध्यम से भेजा जाता है जहां यह एक फॉर्म अपडेट करता है। समस्या तब प्रकट होती है जब यह प्रपत्र बंद हो जाता है।

यहाँ सर्वर पर कोड है:

 // here the bytes of the screenshot are received

 public void appendToMemoryStream(byte[] data, int offset)
        {
            if (!ms.CanWrite) return;    
            try
            {          
                ms.Write(data, offset, getCountForWrite(offset));
                lock (this)
                {
                    nrReceivedBytes = nrReceivedBytes + getCountForWrite(offset);
                    nrBytesToReceive = screenShotSize - nrReceivedBytes;
                }

                if (isScreenShotCompleted() && listener != null)
                {
                    listener.onReceiveScreenShotComplete(this);
                }
            }
            catch (Exception e)
            {
               MessageBox.Show("Error while receiving screenshot" + "\n" + e.GetType() + "\n" + e.StackTrace);
            }
        }




// the code that handles the receiving of a screenshot
public void onReceiveScreenShotComplete(ScreenShot scr)
        {

            this.screenshot = null;

            if (screen != null && screen.Visible)
            {
                screen.updateScreen(scr);
            }          
        }


// and the form
    public partial class Screen : Form
    {
        public string screenUniqueIdentifier;

        public Screen()
        {
            InitializeComponent();          
        }

        public void updateScreen(ScreenShot screenshot)
        {
           Image image = Image.FromStream(screenshot.getMemoryStream());
           this.Show();
           textBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
           textBox1.Image = image;        
        }

क्या कोई कृपया मुझे बता सकता है कि मैं कुछ गलत कहाँ कर रहा हूँ?

0
klaus johan 23 मार्च 2011, 00:29

2 जवाब

सबसे बढ़िया उत्तर

MSDN से: "आपको स्ट्रीम को जीवन भर खुला रखना चाहिए छवि।"

आपके पास एक दौड़ की स्थिति हो सकती है जिसके द्वारा स्क्रीनशॉट से MemoryStream को Image ऑब्जेक्ट के निपटान से पहले निपटाया जा रहा है। यह संभवतः अपवाद का कारण होगा। मुझे नहीं पता कि Image का निपटान अंतर्निहित धारा का निपटान करता है या नहीं, लेकिन अगर ऐसा होता है, तो यह एक और संभावित मुद्दा है।

1
Andrew 23 मार्च 2011, 00:43
ऐसा लगता है कि अपवाद को "this.Show ()" कॉल करने वाली लाइन पर अपडेटस्क्रीन (स्क्रीनशॉट स्क्रीनशॉट) फ़ंक्शन में फेंक दिया गया है। और मैं अतुल्यकालिक सॉकेट का उपयोग कर रहा हूँ
 – 
klaus johan
23 मार्च 2011, 02:11
जोहान मैं विंडोज फॉर्म एपीआई के आंतरिक कामकाज से परिचित नहीं हूं। लेकिन, यह मुझे आश्चर्यचकित नहीं करेगा यदि Form.Show() अनिवार्य रूप से छवि के "आलसी भार" का कारण बनता है। दी गई, पूर्ववर्ती कथन ने छवि बनाई, लेकिन अतुल्यकालिक प्रक्रियाओं के साथ, अभी भी एक दौड़ की स्थिति हो सकती है। आपको कम से कम यह सुनिश्चित करने में सक्षम होना चाहिए कि स्ट्रीम गैर-निपटान बनी रहे और पूरे समय छवि का निपटारा न हो।
 – 
Andrew
23 मार्च 2011, 04:59

फॉर्म की ऑनक्लोजिंग विधि को ओवरराइड करें और श्रोता ऑब्जेक्ट (appendToMemoryStream द्वारा प्रयुक्त) को शून्य पर सेट करें।

सबसे अधिक संभावना यह है कि फॉर्म बंद होने पर भी आप स्क्रीन को स्थानांतरित कर रहे हैं।

बैकग्राउंडवर्कर का उपयोग करना और फिर इसे रद्द करना बेहतर हो सकता है।

0
Richard Schneider 23 मार्च 2011, 00:43