2012-05-15 50 views
6

如果在後臺線程上運行以下代碼,我如何在主線程上'ContinueWith'?UI線程上的任務延續,當從後臺線程啓動時

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

以上不會工作,因爲當前同步上下文已經是後臺線程。

回答

6

您需要從UI線程獲取對TaskScheduler.FromCurrentSynchronizationContext()的引用,並將其傳遞給繼續。

與此類似。 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

我很害怕那樣。感謝您的回答。 – user981225