【问题标题】:Picturebox.Image.Dispose is causing ArgumentException?Picturebox.Image.Dispose 导致 ArgumentException?
【发布时间】:2014-03-20 09:49:05
【问题描述】:

我正在尝试创建一个带有客户端和服务器的远程桌面应用程序(当然)。

但我发现了一个奇怪的问题,在这段代码中:(其中 bytes() 包含客户端发送的桌面截图。

 Public Sub HandleDesktopInfo(ByVal client As ServerClient, ByVal bytes As Byte())
    If PictureBox1.Image IsNot Nothing Then
     PictureBox1.Image.Dispose())
    End If

    Dim ms As New IO.MemoryStream(bytes)
    Dim bmp = New Drawing.Bitmap(ms)
    PictureBox1.Image = bmp

    ms.Dispose()
    fps += 1
End Sub

问题是它抛出了这个错误:

说“参数无效”。

奇怪的是,它只会在

时引发该错误
If PictureBox1.Image IsNot Nothing Then
 PictureBox1.BeginInvoke(Sub() PictureBox1.Image.Dispose())
End If

存在,虽然它说 "Source Not Available...." ,因此没有指向特定的代码行,如果我删除它,它会完美运行。 我还注意到,如果我摇晃表格,它只会引发错误......改变它在我屏幕上的位置(奇怪?),我不明白为什么。如果我让他不动,不会抛出异常……这是怎么回事?

工作解决方案:感谢@jmcilhinney

 Dim newimage As Bitmap = PictureBox1.Image

    Dim ms As New IO.MemoryStream(bytes)
    Dim bmp = New Drawing.Bitmap(ms)
    PictureBox1.Image = bmp

    ms.Close()
    ms.Dispose()



    If newimage IsNot Nothing Then
        newimage.Dispose()
    End If

【问题讨论】:

  • 你需要关闭你的内存流:ms.Close 你只是在处理它。最好将其包装在 using 语句中。
  • @Mr CoDeXeR,我同意应该使用 Using 语句,但这也只会调用 Dispose。但这不是问题,因为无论如何都会关闭 MemoryStream,即当前代码可以改进但不是问题。
  • @MrCoDeXeR 我认为 Dispose 已经在为我过去在网上阅读的内容调用 Close ......显然不是。
  • 另外,如何进一步改进?有什么建议吗?

标签: vb.net visual-studio-2012


【解决方案1】:

我怀疑问题可能是已处理的 Image 仍分配给 PictureBox 的 Image 属性并尝试重新绘制。我建议将 Image 分配给局部变量,将 PictureBox 的 Image 属性设置为 Nothing,然后处理 Image。

【讨论】:

  • 将图像分配给局部变量是什么意思?它已经创建为 bmp,我只需要在图片框上显示一次,如果我使用 picturebox1.image = nothing 它不会引发任何错误,但问题是,它在清除时显示的每一帧中都会闪烁空白它。我想处理以前的图像而不将显示为空白的图片...这可能是某种多余的处理应该清除它,但我不希望界面受到影响,只在内存中保持清洁而不离开垃圾收集器更多的工作......
  • 我不是在谈论新图像。我说的是现有图像,即您要处理的图像。如果您想绝对确保 PictureBox 不会在两者之间变为空白,请在处理旧图像之前显示新图像。
  • 哦,谢谢,这行得通(我没想到,因为在这种特殊情况下我从未使用过图片框...不过,当我将 newimage 等同于picturebox.image,是创建了一个副本,还是 newimage 从 picturebox.image 中删除了值?我将使用有效的解决方案更改我的帖子。
  • Image 是一个类,即引用类型,因此它的行为与所有引用类型一样。这意味着除非您创建对象,否则不会创建对象的副本。有关更多信息,请阅读值类型、引用类型以及它们之间的区别。
猜你喜欢
  • 2017-09-11
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多