c# - 本地任务如何在完成之前避免垃圾回收

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

最佳答案

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

关于c# - 本地任务如何在完成之前避免垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21372867/

相关文章:

c# - 我正在尝试学习如何将 IEnumerable LINQ 集合绑定(bind)到转发器

c# - 将 VB.NET 2005 项目转换为 C# 2008 项目

asynchronous - 当 future 包装它被丢弃时,如何停止运行同步代码?

asynchronous - Amazon S3 异步分段上传

asynchronous - 通过多个 UDP 端口传递数据是否会提高性能

c# - 无法在导航 url 上捕获 Selenium WebDriverException

C# 如何检测循环引用?

c# - WebClient 和多个网络适配器

java - 如何实现异步计算?

javascript - 同步 XHR 弃用