मैं कभी-कभी बंद होने पर विंडो फॉर्म द्वारा फेंके गए ऑब्जेक्टडिस्पोज्ड एक्सेप्शन के साथ संघर्ष कर रहा हूं। मेरे क्लाइंट-सर्वर एप्लिकेशन में, क्लाइंट पर एक स्क्रीनशॉट कैप्चर किया जाता है और फिर सर्वर पर टीसीपी/आईपी के माध्यम से भेजा जाता है जहां यह एक फॉर्म अपडेट करता है। समस्या तब प्रकट होती है जब यह प्रपत्र बंद हो जाता है।
यहाँ सर्वर पर कोड है:
// 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;
}
क्या कोई कृपया मुझे बता सकता है कि मैं कुछ गलत कहाँ कर रहा हूँ?
2 जवाब
MSDN से: "आपको स्ट्रीम को जीवन भर खुला रखना चाहिए छवि।"
आपके पास एक दौड़ की स्थिति हो सकती है जिसके द्वारा स्क्रीनशॉट से MemoryStream
को Image
ऑब्जेक्ट के निपटान से पहले निपटाया जा रहा है। यह संभवतः अपवाद का कारण होगा। मुझे नहीं पता कि Image
का निपटान अंतर्निहित धारा का निपटान करता है या नहीं, लेकिन अगर ऐसा होता है, तो यह एक और संभावित मुद्दा है।
फॉर्म की ऑनक्लोजिंग विधि को ओवरराइड करें और श्रोता ऑब्जेक्ट (appendToMemoryStream द्वारा प्रयुक्त) को शून्य पर सेट करें।
सबसे अधिक संभावना यह है कि फॉर्म बंद होने पर भी आप स्क्रीन को स्थानांतरित कर रहे हैं।
बैकग्राउंडवर्कर का उपयोग करना और फिर इसे रद्द करना बेहतर हो सकता है।
संबंधित सवाल
नए सवाल
c#
C # (उच्चारण "तेज देखें") Microsoft द्वारा विकसित एक उच्च स्तरीय, सांख्यिकीय रूप से टाइप किया हुआ, बहु-प्रतिमान प्रोग्रामिंग भाषा है। C # कोड आमतौर पर Microsoft के .NET परिवार के टूल और रन-टाइम को लक्षित करता है, जिसमें .NET फ्रेमवर्क, .NET कोर और Xamarin अन्य शामिल हैं। C # या C # के औपचारिक विनिर्देश में लिखे गए कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।