es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo pasar parámetros a un delegado (C#, VB) dentro de un bucle.

Tengo una función con un bucle

Sub KvmActionForEachVm(CN As MySqlConnection, SshClient As Renci.SshNet.SshClient, Action As Action(Of MySqlConnection, Renci.SshNet.SshClient, String, Integer))
    Dim AdmVMList As List(Of AdmVM) = ReadAdmVMList(CN)
    For Each One As AdmVM In AdmVMList
        Try
            Action.Invoke(CN, SshClient, One.Name, CInt(One.Id))
            'por ejemplo: ParseVmConfig(CN, SshClient, One.Name, One.Id)
        Catch ex As Exception
            Console.WriteLine(One.Name & " : " & ex.Message)
            Continue For
        End Try
    Next
    SshClient.Disconnect()
End Sub

y varias funciones con la misma firma que pueden funcionar en un bucle como se muestra a continuación. Por supuesto, estas funciones requieren un nombre de VM correcto (One.Name) y un ID de VM (One.Id)

Sub ParseVmConfig(CN As MySqlConnection, SshClient As Renci.SshNet.SshClient, VmName As String, VmId As Integer)
....
End sub

Sin el bucle, normalmente paso delegados como parámetros de la misma manera

KvmActionForEachVm(CN, SshClient, Sub() ParseVmConfig(CN, SshClient, "", 0))

Pero en este caso estoy confundido.

Nota: Estoy utilizando NET Core 5.0 y esta es una captura de pantalla de mi aplicación con este problema.

Imagen: aquí

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con pasar un delegado como parámetro a la función KvmActionForEachVm. En este caso, el delegado que se está pasando utiliza un método anónimo, lo cual puede llevar a confusiones al depurar.

    Una posible solución podría ser definir una función separada que encapsule la funcionalidad del delegado, y luego pasar esa función como parámetro en su lugar. Por ejemplo:

    Sub MyDelegate(CN As MySqlConnection, SshClient As Renci.SshNet.SshClient, VmName As String, VmId As Integer)
        ParseVmConfig(CN, SshClient, VmName, VmId)
    End Sub
    
    KvmActionForEachVm(CN, SshClient, AddressOf MyDelegate)
    

    De esta manera, el delegado se puede nombrar y localizar fácilmente durante la depuración, y cualquier problema con la funcionalidad del delegado se puede abordar por separado de la función KvmActionForEachVm en sí.

Comments are closed.