Pergunta

Pergunta

Provavelmente é algo simples que perdi.

Digamos que sim (em loveley VB):

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()

Observe que t1.ContinueWith é usado duas vezes.Qual é a ordem preferida de execução para essas tarefas?Para mim, é aleatório ou errado.

Por que?

A razão pela qual eu quero fazer isso...

  1. Crie uma tarefa capturando e retornando dados
  2. Seguido por uma tarefa que "organiza" a UI em TaskScheduler.FromCurrentSynchronizationContext() (tópico da interface do usuário)
  3. Siga a tarefa original de captura de dados convertendo os dados em um relatório longo (leva muito tempo)
  4. De volta ao thread da UI, atribua esse relatório a um controle de visualização
  5. Limpeza (livrar-se da minha animação de progresso, etc.)

Isto é ainda mais complicado pelo fato de que o passo 4 é opcional.

No meio de tudo isso, minhas tarefas estão retrocedendo para definir as propriedades dos membros para que a interface do usuário e as tarefas possam funcionar bem.Talvez eu deva abandonar totalmente o resultado da tarefa e apenas limitar-me a sincronizar minhas variáveis ​​de membro.Afinal, todos eles são atribuídos apenas uma vez.

Obrigado, Tom

Foi útil?

Solução

As tarefas são executadas em ordem LIFO para melhor localidade de memória.É claro que isso pode ser alterado se você usar um agendador diferente ou se a MS decidir "consertar" o original.Não acho que você deva confiar nesse comportamento.Em vez disso, você pode desembrulhar sua tarefa para continuar trabalhando na tarefa anterior quando ela for concluída.Caso contrário, você está esperando a coisa errada.Mais informações podem ser encontradas aqui: http://msdn.microsoft.com/en-us/library/ee795275.aspx

Outras dicas

Se você deseja impor a ordem entre t2 e t3, por que simplesmente não muda para que t3 continue de t2 em vez de t1?

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()

Se t2 e t3 forem executados por muito tempo, eles serão executados em paralelo, conforme você escreveu.

Não há necessidade de criar um agendador de tarefas personalizado para alterar esse comportamento.

Com base no seu comentário sobre a resposta de Ian Mercer, sugiro algo 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();

Isso oferece execução determinística e ainda permite compor seu fluxo de trabalho com unidades opcionais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top