Pregunta

Pregunta

Esto es probablemente algo simple que he perdido.

Vamos a decir que hacer (en VB loveley):

Dim t1 As New Task(Sub() Debug.WriteLine("t1"))
Dim t2 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t2"))
Dim t3 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t3"))
t1.Start()

Aviso t1.ContinueWith se utiliza dos veces. ¿Cuál es el orden preferido de ejecución de estas tareas? Para mí, es ya sea al azar o mal.

¿Por qué?

La razón por la que quiero hacer esto ...

  1. Crear una tarea acaparamiento y la devolución de datos
  2. Seguido de una tarea que "tipo out" la interfaz de usuario en TaskScheduler.FromCurrentSynchronizationContext() (rosca UI)
  3. Siga los datos originales que asen tarea mediante la conversión de los datos en un largo informe (lleva mucho tiempo)
  4. De vuelta en el hilo de interfaz de usuario, asignar ese informe a un control
  5. vista previa
  6. Liberador (deshacerse de mi progreso animación, etc)

Esto se hace más complicada por el hecho de que el paso 4 es opcional .

En medio de todo esto, mis tareas se doblan hacia atrás para establecer las propiedades miembros por lo que la interfaz de usuario y las tareas pueden jugar bonito. Tal vez debería abandonar el resultado de tareas por completo y sólo se adhieren a Synclocking variables de mis miembros. Todos ellos están asignados solamente una vez después de todo.

Gracias, Tom

¿Fue útil?

Solución

Las tareas se ejecutan en un orden LIFO para una mejor localización de memoria. Esto se puede cambiar, por supuesto, si se utiliza un programador differnt o si MS decide "solución" a la original. No creo que usted debe confiar en este comportamiento. En su lugar se podría Separar la tarea de continuar trabajando en la tarea anterior cuando se ha completado. De lo contrario usted está esperando en el tema equivocado. Más informaciones se pueden encontrar aquí: http://msdn.microsoft.com/en- es / library / ee795275.aspx

Otros consejos

Si desea ejecutar la orden de entre t2 y t3, ¿por qué no sólo el cambio es por lo que continúa desde t3 t2 t1 en lugar de?

Dim t1 As New Task(Sub() Debug.WriteLine("t1"))
Dim t2 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t2"))
Dim t3 As Task = t2.ContinueWith(Sub() Debug.WriteLine("t3"))
t1.Start()

Si T2 y T3 fueron carreras de larga van a ejecutar en paralelo a medida que lo hizo escribir.

No hay necesidad de crear un planificador de tareas personalizado para cambiar este comportamiento.

Sobre la base de sus comentarios sobre la respuesta de Ian Mercer sugeriría algo así como

Task t1 = new Task((_)=>Console.WriteLine("t1"));
Task tn = secondTaskCondition ? t1.ContinueWith((_)=>Console.WriteLine("t2")) : t1;
Task t3 = tn.ContinueWith((_)=>Console.WriteLine("t3"));
t1.Start();

Esto le da la ejecución determinista y todavía le permite componer su flujo de trabajo con las unidades opcionales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top