2017-07-11 5 views
0

J'ai un TcpListener qui obtient un flux sans fin de byte array. De cela, je convertis le byte() en MemoryStream et nourris un PictureBox pour afficher les images. Cela fonctionne bien. Si je mets les points d'ancrage sur le PictureBox à top/right/bottom/left qui signifie que l'image se développera lorsque la forme se développe et alors j'étendre effectivement la forme, je reçois l'erreur suivante:Redimensionner le formulaire avec l'image ancrée (à partir de MemoryStream) provoque 'System.ArgumentException' et 'L'application est en mode pause'

An unhandled exception of type 'System.ArgumentException' occurred in System.Drawing.dll 

Additional information: Parameter is not valid. 

En outre,

The application is in break mode 

code

' Enter the listening loop. 
     While True 
      Dim client As TcpClient = Await server.AcceptTcpClientAsync() 
      Dim stream As NetworkStream = client.GetStream 
      Dim MS As New MemoryStream 
      Await stream.CopyToAsync(MS) 
      Await ViewImage(MS) 
      client.Close() 
     End While 

Voir fonction d'image:

Public Async Function ViewImage(ms As MemoryStream) As Task 
     Try 
      Dim myimage As Bitmap 
      myimage = New Bitmap(ms) 
      PictureBox1.Image = myimage 
      PictureBox1.Refresh() 
      myimage.Dispose() 
     Catch ex As Exception 
      MessageBox.Show(ex.ToString) 
     End Try 

    End Function 

Veuillez noter que l'exception n'est pas interceptée dans mon code. Des idées?

+0

Êtes-vous sûr que _ ** la l'image entière ** _ est reçue? Comme TCP est un protocole basé sur les flux, la couche application n'a aucune connaissance des paquets/de la longueur de vos données. Vous pouvez soit essayer de sérialiser/désérialiser l'image sur le flux en utilisant _Binary Serialization_, ou voir [** cette réponse de la mine **] (https://stackoverflow.com/a/35240061/3740093) qui vous aide à diviser les données en des paquets de votre choix (connu sous le nom de _message framing_). –

+1

Oh, attends, tu as manqué de fermer la connexion une fois l'image reçue. Alors ce n'est pas lié aux données ou à la taille de paquet (bien que ce que j'ai dit ci-dessus pourrait être une bonne chose à considérer dans le futur;)). –

+1

Content de pouvoir aider!Je ne sais pas ce que vous savez sur les types de référence/valeur, mais j'ai ajouté un exemple de base à ma réponse pour ceux qui ne le savent pas. –

Répondre

2

La question est très probablement lié au fait que vous myimage disposer à la fin de votre méthode ViewImage().

Ce:

PictureBox1.Image = myimage 
... 
myimage.Dispose() 

fait myimage et PictureBox1.Image pointent vers le même objet Bitmap. Les bitmaps sont des types de référence (classes), ce qui signifie que vous passez simplement leur pointeur de référence lorsque vous l'affectez à différentes variables.

Ainsi, lorsque vous disposez myimage vous débarrassez la même image qui est représentée dans le PictureBox, ce qui pourrait causer cette erreur de la vôtre lorsque GDI + tente de redessiner une version allongée de celui-ci (en fait même pas l'original l'image devrait être affichée une fois que vous l'avez éliminée).

Pour plus d'informations, voir: Value Types and Reference Types - Microsoft Docs.


exemple de base de types de référence et types Valeur travail

types de référence:

Dim A As New Bitmap("image.bmp") 

Dim B As Bitmap = A 'Points to A. 
PictureBox1.Image = A 'Points to A. 
PictureBox2.Image = B 'Still points to A. 

'Calling Dispose() on any of the above will result in none of them having an image since you will ultimately dispose bitmap A. 

types de valeur:

Dim A As Integer = 3 

Dim B As Integer = A 'Copy of A. 
Dim C As Integer = B 'Copy of B. 

C = 4 'Results in A = 3, B = 3, C = 4.