Domanda

Domanda

Questo è probabilmente qualcosa di semplice che ho perso.

esempio di Let me (in 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()

Avviso t1.ContinueWith viene utilizzato due volte. Qual è l'ordine di esecuzione preferita per questi compiti? Per me, è sia casuale o sbagliato.

Perché?

Il motivo che voglio fare questo ...

  1. Creare un'attività che afferra e la restituzione dei dati
  2. Seguita da un compito che "le specie fuori" l'interfaccia utente su TaskScheduler.FromCurrentSynchronizationContext() (thread UI)
  3. Segui i dati originali afferrando compito convertendo i dati in un lungo rapporto (prende le età)
  4. Torna sul thread dell'interfaccia utente, assegnare tale relazione ad una anteprima di controllo
  5. Cleanup (sbarazzarsi dei miei progressi animazione etc)

Questo è reso più complicato dal fatto che la fase 4 è opzionale .

In mezzo a tutto questo, i miei compiti sono piega indietro per impostare le proprietà membri così l'interfaccia utente e le attività possono giocare bello. Forse dovrei abbandonare il risultato Task del tutto e solo rispettare Synclocking mie variabili membro. Sono tutti assegnati solo una volta dopotutto.

Grazie, Tom

È stato utile?

Soluzione

I compiti vengono eseguiti in un ordinamento LIFO per una migliore località di memoria. Questo può essere cambiato, naturalmente, se si utilizza un programmatore differente o se MS decide di "fissare" l'originale. Non credo che si dovrebbe fare affidamento su questo comportamento. Invece si potrebbe Unwrap vostro compito di continuare a lavorare sul compito precedente quando ha completato. In caso contrario, si è in attesa sulla cosa sbagliata. Ulteriori informazioni possono essere trovate qui: http://msdn.microsoft.com/en- us / library / ee795275.aspx

Altri suggerimenti

Se si desidera applicare l'ordine tra il T2 e T3, perché non lo fai solo cambiamento è così che continua t3 da T2 invece di 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 sono state a lungo in esecuzione che verranno eseguiti in parallelo come se fosse scritta.

Non c'è bisogno di creare una task scheduler personalizzata per modificare questo comportamento.

In base al commento sulla risposta di Ian Mercer vorrei suggerire qualcosa di simile

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

Questo vi dà l'esecuzione deterministica e permette ancora di comporre il flusso di lavoro con le unità opzionali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top