1. 程式人生 > 實用技巧 >對 精緻碼農大佬 說的 Task.Run 會存在 記憶體洩漏 的思考

對 精緻碼農大佬 說的 Task.Run 會存在 記憶體洩漏 的思考

一:背景

1. 講故事

這段時間專案延期,加班比較厲害,部落格就稍微停了停,不過還是得持續的技術輸出呀! 園子裡最近挺熱鬧的,精緻碼農大佬分享了三篇文章:

核心程式碼如下:


    class Program
    {
        static void Main(string[] args)
        {
            Test();
            Console.ReadLine();
        }

        static void Test()
        {
            var myClass = new MyClass();

            myClass.Foo();
        }
    }

    public class MyClass
    {
        private int _id = 10;

        public Task Foo()
        {
            return Task.Run(() =>
            {
                Console.WriteLine($"Task.Run is executing with ID {_id}");
            });
        }
    }

大意是: Test() 方法執行完之後, myClass 本該銷燬,結果發現 Foo() 方法引用了 _id ,導致 GC 放棄了對 myClass 的回收,從而導致記憶體洩漏。

如果我的理解有誤,請大家幫忙指正,挺有意思,評論區也是熱鬧非凡,總體看下來發現還是有很多朋友對 閉包, 記憶體洩漏,GC 等概念的認知比較模糊,同樣作為技術博主,得要蹭點熱度