2014-01-27 65 views
1

我很想知道調用異步方法 時如何管理任務的生命週期,並存儲本地變量中返回的任務。考慮以下代碼本地任務在完成之前如何避免垃圾回收

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     this.InitializeComponent(); 
    } 

    private void loadButton_Click(object sender, EventArgs e) 
    { 
     var client = new WebClient(); 

     var task = client.DownloadStringTaskAsync(new Uri(@"http:\\www.rpmglobal.com")); 
     task.ContinueWith(t => 
     { 
      try 
      { 
       this.textBox.Text = t.Result; 
      } 
      catch (AggregateException ex) 
      { 
       this.textBox.Text = "ERROR: " + ex.InnerException.Message; 
      } 
     }, TaskScheduler.FromCurrentSynchronizationContext());  
    } 
} 

變量task是一個局部變量,應儘快進行垃圾回收變爲可用的方法退出任務完成之前它可能會很長。什麼是確保這不會發生的機制?

+0

變量不可用於垃圾回收。引用變量的*對象*引用* may。 –

回答

3

無論DownloadStringTaskAsync是幹什麼的,在某個時間點,它必須能夠爲其返回的Task設置Result,並將其標記爲完整。因此,邏輯上,它也必須有一個對這個對象的引用(引用可能是通過引用鏈或它可能是直接引用)

+0

嗯,無論是那個,還是'Task'都有一個引用,當它讀取'Result'屬性並調用'ContinueWith'時,它會檢查其他對象。在這種情況下,Task對象本身可能被垃圾回收,但這不是問題,因爲無論如何都沒有使用它。 – hvd

0

基本上,有一個線程正在運行。
運行的線程不gc'ed (如果會出現這種情況,垃圾收集
可能結束你的主要隨時隨地)