Nel frammento di seguito, un'attività crea due attività figlio utilizzando TaskCreationOptions.AttachedToParent, il che significa che l'attività padre attenderà il completamento delle attività figlio.Valore di ritorno dalle attività padre-figlio
La domanda è: perché l'attività padre non restituisce il valore corretto [102]? Determina innanzitutto il suo valore di ritorno e quindi attende che le attività figlio finiscano. Se è così, allora qual è il punto di creare una relazione genitore-figlio?
void Main()
{
Console.WriteLine ("Main start.");
int i = 100;
Task<int> t1 = new Task<int>(()=>
{
Console.WriteLine ("In parent start");
Task c1 = Task.Factory.StartNew(() => {
Thread.Sleep(1000);
Interlocked.Increment(ref i);
Console.WriteLine ("In child 1:" + i);
}, TaskCreationOptions.AttachedToParent);
Task c2 = Task.Factory.StartNew(() => {
Thread.Sleep(2000);
Interlocked.Increment(ref i);
Console.WriteLine ("In child 2:" + i);
}, TaskCreationOptions.AttachedToParent);
Console.WriteLine ("In parent end");
return i;
});
t1.Start();
Console.WriteLine ("Calling Result.");
Console.WriteLine (t1.Result);
Console.WriteLine ("Main end.");
}
L'output:
Main start.
Calling Result.
In parent start
In parent end
In child 1:101
In child 2:102
100
Main end.
Sì, attendere e restituire il valore sono cose diverse, ma perché non aspettare prima di decidere il valore restituito. Pensi che questo potrebbe essere un bug in TPL? – thewpfguy
@thewpfguy No, non è sicuramente un bug. È una conseguenza naturale del fatto che il risultato di un'attività viene memorizzato nella cache se esce prima che l'attività che ha avviato la prima attività acceda al valore di ritorno della prima attività. –