表单抛出的ObjectDisposedException

时间:2011-03-22 21:29:22

标签: c# winforms

我正在努力解决在关闭时窗口窗体有时抛出的ObjectDisposedException。在我的客户端 - 服务器应用程序中,在客户端捕获屏幕截图,然后通过TCP / IP在服务器上发送,更新表单。关闭此表单时会出现此问题。

这是服务器上的代码:

 // 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 个答案:

答案 0 :(得分:1)

来自MSDN:“您必须在图片的生命周期内保持流打开。”

您可能遇到一种竞争条件,在MemoryStream对象处置之前,屏幕截图中的Image处于该竞争状态。这可能会导致异常。我不知道是否处置Image处理基础流,但如果是,则这是另一个可能的问题。

答案 1 :(得分:0)

重写Form的OnClosing方法,并将listener对象(由appendToMemoryStream使用)设置为null。

最有可能发生的事情是,您在表单关闭时仍在转移屏幕。

最好使用BackgroundWorker然后取消它。