2012-05-15 8 views
6

Wenn der folgende Code auf dem Hintergrund Thread ausgeführt wird, wie kann ich 'ContinueWith' auf dem Hauptthread?Taskfortsetzung auf UI-Thread, wenn vom Hintergrund Thread gestartet

var task = Task.Factory.StartNew(() => Whatever()); 
    task.ContinueWith(NeedThisMethodToBeOnUiThread), TaskScheduler.FromCurrentSynchronizationContext()) 

Die oben wird nicht funktionieren, da die aktuelle Synchronisationskontext Thread bereits ein Hintergrund ist.

Antwort

6

Sie müssen einen Verweis auf TaskScheduler.FromCurrentSynchronizationContext() vom UI-Thread abrufen und an die Fortsetzung übergeben.

Ähnliches. http://reedcopsey.com/2009/11/17/synchronizing-net-4-tasks-with-the-ui-thread/

private void Form1_Load(object sender, EventArgs e) 
{ 
    // This requires a label titled "label1" on the form... 
    // Get the UI thread's context 
    var context = TaskScheduler.FromCurrentSynchronizationContext(); 

    this.label1.Text = "Starting task..."; 

    // Start a task - this runs on the background thread... 
    Task task = Task.Factory.StartNew(() => 
     { 
      // Do some fake work... 
      double j = 100; 
      Random rand = new Random(); 
      for (int i = 0; i < 10000000; ++i) 
      { 
       j *= rand.NextDouble(); 
      } 

      // It's possible to start a task directly on 
      // the UI thread, but not common... 
      var token = Task.Factory.CancellationToken; 
      Task.Factory.StartNew(() => 
      { 
       this.label1.Text = "Task past first work section..."; 
      }, token, TaskCreationOptions.None, context); 

      // Do a bit more work 
      Thread.Sleep(1000); 
     }) 
     // More commonly, we'll continue a task with a new task on 
     // the UI thread, since this lets us update when our 
     // "work" completes. 
     .ContinueWith(_ => this.label1.Text = "Task Complete!", context); 
} 
+0

war ich, dass Angst. Danke für deine Antwort. – user981225

Verwandte Themen