2010-04-21 16 views
7
if (InvokeRequired) 
{ 
    BeginInvoke(new MethodInvoker(delegate() 
    { 
    textBox1.Text = args.Fax.Port.ToString(); 
    textBox2.Text = args.Fax.FaxStatus.ToString(); 
    })); 
} 
+1

En el futuro, ayuda a tener en cuenta cuál es el mensaje de error se recibió desde el compilador;) – jcolebrand

+1

Sólo pega el código VB.Net convertida (de developerfusion.com) en mi aplicación ... termino con 14 errores del sabor: Declaración esperada./Satement no puede aparecer fuera de un método./'End Try' debe ir precedido de una coincidencia 'Try'/'End Sub' debe ir precedida por un 'Sub'/ 'If' debe coincidir con un 'End If'/Expression expected/'End Sub' correspondiente esperado/Fin del resumen esperado – beaudetious

+0

Jon, gracias por la edición de la etiqueta. Tantas opciones ... – beaudetious

Respuesta

5

De MSDN

Delegate Sub MyDelegate(myControl As Label, myArg2 As String) 

Private Sub Button_Click(sender As Object, e As EventArgs) 
    Dim myArray(1) As Object 

    myArray(0) = New Label() 
    myArray(1) = "Enter a Value" 
    myTextBox.BeginInvoke(New MyDelegate(AddressOf DelegateMethod), myArray) 
End Sub 

Public Sub DelegateMethod(myControl As Label, myCaption As String) 
    myControl.Location = New Point(16, 16) 
    myControl.Size = New Size(80, 25) 
    myControl.Text = myCaption 
    Me.Controls.Add(myControl) 
End Sub 

Así

if (InvokeRequired) 
{ 
    BeginInvoke(new MethodInvoker(delegate() 
    { 
    textBox1.Text = args.Fax.Port.ToString(); 
    textBox2.Text = args.Fax.FaxStatus.ToString(); 
    })); 
} 

Delegate Sub MyDelegate(faxPort As String, faxStatus As String) 

If InvokeRequired Then 
    Dim aArray(1) as Object 
    aArray(0) = args.Fax.Port.ToString() 
    aArray(1) = args.Fax.FaxStatus.ToString(); 
    BeginInvoke(New MyDelegate(AddressOf MySub), aArray) 
End If 

Sub MySub(faxPort as String, faxStatus as String) 
    textBox1.Text = faxPort 
    textBox2.Text = faxStatus 
End Sub 

creo

4

Cortesía de developerfusion.com:

If InvokeRequired Then 
    BeginInvoke(New MethodInvoker(Function() Do 
     textBox1.Text = args.Fax.Port.ToString() 
     textBox2.Text = args.Fax.FaxStatus.ToString() 
    End Function)) 
End If 
+0

Sí, lo intenté también. No funcionó No compilará – beaudetious

+0

@beaudetious: ¡puede haber algún problema con otras partes de tu código! –

+0

Esta sintaxis es nueva en VB 10, pero es un poco incorrecta. – SLaks

3

Hasta Visual Studio 2010, VB.Net no soporta múltiples instrucciones funciones anónimas.

Necesita mover el método anónimo a un método diferente que toma args como parámetro, luego llame al Invoke en él.

+0

¿De verdad? Gracias por la info. No estaba al tanto de esa limitación de una línea con VB.NET <10 – jcolebrand

+0

Una muestra de código me ayudaría aquí. Gracias. – beaudetious

4

VB.NET 9 y anterior no es compatible con las funciones anónimas de varias líneas. Usted tiene que escribir una función separada:

If InvokeRequired Then 
    BeginInvoke(New MethodInvoker(AddressOf MySub)) 
End If 

donde MySub:

Sub MySub() 
    textBox1.Text = args.Fax.Port.ToString() 
    textBox2.Text = args.Fax.FaxStatus.ToString()  
End Sub 

ACTUALIZACIÓN:

Para aclarar acerca del parámetro args hay una sobrecarga de BeginInvoke que podría ser utilizado y en este caso, el delegado MethodInvoker ya no es adecuado. Action(Of T) funcionaría:

If InvokeRequired Then 
    BeginInvoke(New Action(Of SomeType)(AddressOf MySub), args) 
End If 

y:

Sub MySub(ByVal args as SomeType) 
    textBox1.Text = args.Fax.Port.ToString() 
    textBox2.Text = args.Fax.FaxStatus.ToString()  
End Sub 

Después de todo es cosas sencillas como esta que hacen desarrolladores de C# feliz :-) (por favor, no lo toman mal, no tengo nada en contra de VB. NET)

+1

'args' es probablemente un parámetro del método original. – SLaks

+0

Una gran sugerencia, pero ¿cómo paso los argumentos a MySub desde MethodInvoker? – beaudetious

+0

@beaudetious, por favor mira mi actualización. –

1

Dado que las observaciones no permiten el formato, voy a publicar mi solución de trabajo aquí. Gracias a todos los que intervinieron: Darin, SLaks, drachenstern, Jay.

Private Sub myControl_FaxStatus(ByVal sender As Object, ByVal args As DataTech.FaxManNet.FaxEventArgs) 
    frmModemStatus.UpdateStatus(args.Fax) 

    If InvokeRequired Then 
    Dim aArray(1) As Object 
    aArray(0) = args.Fax.Port.ToString() 
    aArray(1) = args.Fax.FaxStatus.ToString() 
    BeginInvoke(New MyDelegate(AddressOf UpdateStatusDisplay), aArray) 
    End If 

    Try 
    TextBox1.Text = args.Fax.Port.ToString() 
    TextBox2.Text = args.Fax.FaxStatus.ToString() 
    Catch ex As Exception 
    System.Diagnostics.Debug.WriteLine("ex = " & ex.ToString()) 
    End Try 

End Sub 

Delegate Sub MyDelegate(ByVal faxPort As String, ByVal faxStatus As String) 

Private Sub UpdateStatusDisplay(ByVal faxPort As String, ByVal faxStatus As String) 
    TextBox1.Text = faxPort 
    TextBox2.Text = faxStatus 
End Sub 
0

Si necesita cosas similares en la característica solo instale el siguiente componente en su estudio visual. Después de eso puede convertir fácilmente de C# a vb.net o vb.net a C#. El soporte VS2010 ya está incluido. http://codeconvert.codeplex.com/

Cuestiones relacionadas