VB.NET 2010, .NET 4VB.NET Dos enfoques diferentes para las operaciones genéricas de subprocesos cruzados; ¿cual es mejor?
Hola,
poco leí acerca del uso de SynchronizationContext
objetos para controlar el flujo de ejecución de un código. He estado usando una subrutina genérica para manejar (posiblemente) llamadas entre hilos para cosas como la actualización de controles de IU que utilizan Invoke
. Soy un aficionado y me cuesta entender las ventajas y desventajas de cualquier enfoque particular. Estoy buscando información sobre qué enfoque sería preferible y por qué.
Actualización: Esta pregunta está motivada, en parte, por declaraciones como las siguientes del MSDN page on Control.InvokeRequired
.
Una mejor solución es utilizar la
SynchronizationContext
devuelto porSynchronizationContext
en lugar de un control para el cálculo de referencias entre subprocesos.
Y también, confusión general de por qué, al mirar alrededor, la mayoría de las respuestas a las preguntas con respecto a este tipo de problema en sugerir lo que el enfoque Invoke
sin mencionar a este método.
Método 1:
Public Sub InvokeControl(Of T As Control)(ByVal Control As T, ByVal Action As Action(Of T))
If Control.InvokeRequired Then
Control.Invoke(New Action(Of T, Action(Of T))(AddressOf InvokeControl), New Object() {Control, Action})
Else
Action(Control)
End If
End Sub
Método 2:
Public Sub UIAction(Of T As Control)(ByVal Control As T, ByVal Action As Action(Of Control))
SyncContext.Send(New Threading.SendOrPostCallback(Sub() Action(Control)), Nothing)
End Sub
Dónde SyncContext
es un objeto Threading.SynchronizationContext
definido en el constructor de mi forma de interfaz de usuario (lo guarde en un módulo ... No está seguro si esa es la mejor opción):
Public Sub New()
InitializeComponent()
SyncContext = WindowsFormsSynchronizationContext.Current
End Sub
Entonces, si quería actualizar e un control (por ejemplo, Label1
) en el formulario de interfaz de usuario, lo haría:
InvokeControl(Label1, Sub(x) x.Text = "hello")
o
UIAction(Label1, Sub(x) x.Text = "hello")
Entonces, ¿qué piensan ustedes? ¿Se prefiere una forma o depende del contexto? ¡Si tiene tiempo, apreciaría la verbosidad!
Gracias de antemano,
Brian