c# - run - Pasando argumentos con valores cambiantes a Tarea-¿Comportamiento?
task parallel library c# (1)
Escenario: una tarea asíncrona en un bucle ejecuta un método que contiene argumentos que cambian a medida que el programa continúa:
while(this._variable < 100)
{
this._variable++;
var aTask = Task.Factory.StartNew(() =>
{
aList.add(this._variable);
update(this._savePoint);
});
}
Si el bucle se ejecuta más rápido que las tareas completas, ¿la lista agregará el valor actual de la variable o se guardará la variable localmente y se agregará el valor original?
Los cierres se cierran sobre variables, no valores. Por lo tanto, el incremento de _variable
puede alterar el comportamiento de la tarea que se refiere a ella.
Puedes evitar esto haciendo una copia local:
while (this._variable < 100)
{
this._variable++;
int local = _variable;
var aTask = Task.Factory.StartNew(() =>
{
aList.add(local);
update(this._savePoint);
});
}
O podría pasar el valor a la tarea como estado:
while (this._variable < 100)
{
this._variable++;
var aTask = Task.Factory.StartNew(object state =>
{
aList.add((int)state);
update(this._savePoint);
}, this._variable);
}
Ambos funcionan copiando el valor de _variable
en una nueva variable temporal. En el primer caso, la variable local
se define dentro del alcance del bucle, por lo que obtiene una nueva para cada iteración. En el segundo caso, hace una copia del valor de _variable
cuando lo pasa a la Tarea como el argumento de state
. Si _variable
fuera un tipo de referencia, estas soluciones no funcionarían; Tendrías que realizar un clon.