2013-08-19 9 views
8

Il Test_Click di seguito è una versione semplificata del codice che viene eseguito su un thread UI (con WindowsFormsSynchronizationContext):Task.ContinueWith acquisisce il contesto del thread chiamante per la continuazione?

void Test_Click(object sender, EventArgs e) 
{ 
    var task = DoNavigationAsync(); 
    task.ContinueWith((t) => 
    { 
     MessageBox.Show("Navigation done!"); 
    }, TaskScheduler.FromCurrentSynchronizationContext()); 
} 

Devo specificare esplicitamente TaskScheduler.FromCurrentSynchronizationContext() per assicurarsi che verrà eseguita l'azione prosecuzione sullo stesso thread UI? Oppure, ContinueWith acquisisce automaticamente il contesto di esecuzione (quindi, rendendo l'argomento TaskScheduler ridondante in questo caso)?

Suppongo che non lo faccia di default (a differenza di await), ma fino ad ora non sono riuscito a trovare una risorsa online per confermarlo.

risposta

6

Non usa contesto sincronizzazione corrente per impostazione predefinita, ma TaskScheduler.Current, come mostrato nel seguente codice decompilato:

public Task ContinueWith(Action<Task<TResult>> continuationAction) 
{ 
    StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; 
    return this.ContinueWith(continuationAction, TaskScheduler.Current, new CancellationToken(), TaskContinuationOptions.None, ref stackMark); 
} 

TaskScheduler.Current è o TaskScheduler.Default o TaskScheduler dell'attività corrente se l'attività è compito del bambino. Specificare sempre l'utilità di pianificazione se non si desidera eseguire weird problems o, meglio, utilizzare await se è possibile.

+0

Grazie, ha perfettamente senso. Ho anche trovato [questo] (http://www.jaylee.org/post/2012/09/29/C-Async-Tips-and-Tricks-Part-3-Tasks-and-the-Synchronization-Context .aspx), correlati e molto utili. – Noseratio

+0

Ancora più facile da trovare ora con la fonte di riferimento: http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/Task.cs#27c5b7fbe5caaa18 Detto questo, potresti spiegare cosa fa StackCrawlMark? – Kakira

Problemi correlati