Question

Cela m’embrouille énormément car je ne fais rien avec Strings.

Voici les détails que le débogueur me rend:

  

System.FormatException non gérée     Message = La chaîne d'entrée n'était pas dans le bon format.     Source = System.Windows.Forms     Trace de la pile:          at System.Windows.Forms.Control.MarshaledInvoke (Appelant de contrôle, méthode Delegate, object [] args, Boolean synchrone)          at System.Windows.Forms.Control.Invoke (méthode Delegate, Object [] args)          at Receiver.Class1.CrossThreadAddControl (Control ControlToAdd, Control BaseControl) dans C: \ Utilisateurs \ Jonathan \ Documents \ Visual Studio 2010 \ Projets \ Receiver \ Receiver \ Class1.vb: ligne 28          at Receiver.ContactList.AddContact (utilisateur du contact) dans C: \ Utilisateurs \ Jonathan \ documents \ visual studio 2010 \ Projets \ Receiver \ Receiver \ ContactList.vb: ligne 25          à Receiver.Form1.MySub (IAsyncResult ar) dans C: \ Utilisateurs \ Jonathan \ Documents \ Visual Studio 2010 \ Projets \ Receiver \ Receiver \ Form1.vb: ligne 45          sur System.Net.LazyAsyncResult.Complete (IntPtr userToken)          sur System.Net.ContextAwareResult.CompleteCallback (état d'objet)          at System.Threading.ExecutionContext.runTryCode (Object userData)          sur System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (code TryCode, code BackoutCode, objet userData)          à System.Threading.ExecutionContext.RunInternal (ExecutionContext executionContext, rappel ContextCallback, état de l'objet)          à System.Threading.ExecutionContext.Run (ExecutionContext executionContext, rappel ContextCallback, état de l'objet)          sur System.Net.ContextAwareResult.Complete (IntPtr userToken)          sur System.Net.LazyAsyncResult.ProtectedInvokeCallback (Résultat de l'objet, IntPtr userToken)          sur System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback (Code d'erreur UInt32, NumBytes UInt32, NativeOverlapped * nativeOverlapped)          sur System.Threading._IOCompletionCallback.PerformIOCompletionCallback (Code d'erreur UInt32, Nb octets UInt32, NativeOverlapped * pOVERLAP)     InnerException:

En gros, il existe un sous-nom appelé AddContact dans un usercontrol (ContactList) qui prend 3 chaînes et les place dans un autre USerControl (Contact), puis ajoute le contact à la liste de contacts. La liste de contacts se trouve sur le formulaire principal et AddContact Sub est démarré à partir d'un autre thread, d'où la nécessité d'invoquer.

    Public Class ContactList

       Sub AddContact(ByVal user As Contact)

        If Me.Controls.Count = 0 Then
            user.Location = New Drawing.Point(0, 0)
        Else
            user.Location = New Drawing.Point(0, Me.Controls.Count * 20)
        End If
        user.Width = Me.Width
        user.Displayname = user.Username
        For Each UC As Control In Me.Controls
            If TypeOf UC Is Contact Then
                If CType(UC, Contact).Username = user.Username Then
                    user.Displayname = user.Username & "@" & user.PCname
                End If

            End If
        Next
        Class1.CrossThreadAddControl(user, Me)

    End Sub
End Class

et c’est la ligne avec les 2 astérisques (pas réellement dans le code) qui pose apparemment les problèmes

    Shared Sub CrossThreadAddControl(ByVal ControlToAdd As Control, ByVal BaseControl As Control)
    If BaseControl.InvokeRequired Then
        Dim d As New AddUserD(AddressOf AddUser)
    **BaseControl.Invoke(d, ControlToAdd, BaseControl)**



    End If
End Sub
Delegate Sub AddUserD(ByVal ControlToAdd As Control, ByVal BaseControl As Control)
Shared Sub AddUser(ByVal ControlToAdd As Control, ByVal BaseControl As Control)
    BaseControl.Controls.Add(ControlToAdd)
End Sub

Donc, une idée, pourquoi dire que la chaîne d'entrée n'était pas dans le bon format? (oh et si j'attrape l'exception (avec Try and Catch) et que je n'écris rien dans la section catch, ça continue et ça fonctionne correctement sans casser.

Était-ce utile?

La solution

Remplacez .Invoke par .BeginInvoke et .EndInvoke pour obtenir le stacktrace real . (Uniquement à des fins de débogage, vous pouvez le modifier ultérieurement. Voir ici .)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top