本地任务如何在完成之前避免垃圾收集

时间:2014-01-27 04:07:55

标签: c# asynchronous

我很想知道在调用异步方法时如何管理任务的生命周期 并存储在局部变量中返回的任务。考虑一下这段代码

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是一个局部变量,一旦方法退出,它就可以在任务完成之前很久就可用于垃圾收集。确保不发生这种情况的机制是什么?

2 个答案:

答案 0 :(得分:3)

无论DownloadStringTaskAsync正在做什么,在稍后的某个时间点,它必须能够为它返回的Result设置Task,并将其标记为完成。因此,逻辑上,它也必须引用此Task对象(引用可以通过引用链或它可以是直接引用)

答案 1 :(得分:0)

基本上,有一个线程正在运行 运行线程不是gc'ed (如果是这种情况,垃圾收集器
可以在任何时候结束你的主要)