我正在努力解决在关闭时窗口窗体有时抛出的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;
}
有人可以指出我在哪里做错了吗?
答案 0 :(得分:1)
来自MSDN:“您必须在图片的生命周期内保持流打开。”
您可能遇到一种竞争条件,在MemoryStream
对象处置之前,屏幕截图中的Image
处于该竞争状态。这可能会导致异常。我不知道是否处置Image
处理基础流,但如果是,则这是另一个可能的问题。
答案 1 :(得分:0)
重写Form的OnClosing方法,并将listener对象(由appendToMemoryStream使用)设置为null。
最有可能发生的事情是,您在表单关闭时仍在转移屏幕。
最好使用BackgroundWorker然后取消它。