2013-08-19 4 views
8

Die Test_Click unten ist eine vereinfachte Version von Code, der auf einem UI-Thread ausgeführt wird (mit WindowsFormsSynchronizationContext):Erfasst Task.ContinueWith den aufrufenden Threadkontext für die Fortsetzung?

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

Soll ich ausdrücklich TaskScheduler.FromCurrentSynchronizationContext() angeben, um die Fortsetzung Aktion sicherstellen, dass auf dem gleichen UI-Thread ausgeführt werden? Oder erfasst ContinueWith den Ausführungskontext automatisch (und macht in diesem Fall das Argument TaskScheduler überflüssig)?

Ich nehme an, es tut es nicht standardmäßig (im Gegensatz await), aber bis jetzt konnte ich keine Online-Ressource finden, um dies zu bestätigen.

Antwort

6

Es ist nicht den aktuellen Synchronisationskontext standardmäßig verwenden, aber TaskScheduler.Current, wie in dem folgenden dekompilierten Code gesehen:

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 sind entweder TaskScheduler.Default oder die Taskscheduler der aktuellen Aufgabe, wenn die Aufgabe eines Kinderaufgabe. Geben Sie immer den Taskplaner an, wenn Sie nicht auf weird problems zugreifen möchten, oder besser, verwenden Sie await, wenn Sie können.

+0

Danke, macht vollkommen Sinn. Ich habe auch [das] gefunden (http://www.jaylee.org/post/2012/09/29/C-Async-Tips-and-Tricks-Part-3-Tasks-and-the-Synchronization-Context .aspx), verwandt und sehr hilfreich. – Noseratio

+0

Noch einfacher, jetzt mit der Referenzquelle zu finden: http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/Task.cs#27c5b7fbe5caaa18 Das sagte, könnten Sie bitte erklären, was der StackCrawlMark tut? – Kakira

Verwandte Themen