Entiendo por qué los controles de GUI tienen afinidad de subprocesos.¿Por qué los controles WinForms/WPF no usan Invoke internamente?
Pero ¿por qué los controles no usan la invocación interna en sus métodos y propiedades?
Ahora usted tiene que hacer este tipo de cosas sólo para actualizar el valor TextBox
:
this.Invoke(new MethodInvoker(delegate()
{
textBox.Text = "newValue";
}
Mientras que utilizando sólo textBox.Text = "newValue";
sería suficiente para representar a la misma lógica.
Todo lo que tendría que hacer es cambiar textBox.Text
lógica de esto (pseudocódigo):
public string Text
{
set
{
if(!this.InvokeRequired)
// do the change logic
else
throw new BadThreadException();
}
}
Para esto:
public string Text
{
set
{
if(!this.InvokeRequired)
// do the change logic
else
this.Invoke(new MethodInvoker(delegate()
{
// do the change logic
}
}
}
Lo mismo ocurre con getters y métodos.
desde luego no estoy proponiendo para eliminar Invoke
/BeginInvoke
, sólo estoy preguntando por qué los controles no hacen cambiar el hilo necesaria a sí mismos en lugar de lanzar una excepción.
Debido a que por lo general no debe tener una necesidad de actualizar los controles en un subproceso diferente de lo que se crearon sucesivamente.Hacerlo es un caso excepcional, así que tienes que saltar por los aros. No habría casi ningún beneficio al tener esto incorporado. –
Supongo que cualquier "Invocación" individual implica más sobrecarga, y si tiene muchos controles que invocan automáticamente, puede incurrir en problemas de rendimiento. Al arrojar el excpetion, el sistema obliga a los desarrolladores a preocuparse por los problemas de subprocesamiento, y usa Dispatcher para hacer una sola llamada Invoke con todas las asignaciones dentro. – BertuPG