對 精緻碼農大佬 說的 Task.Run 會存在 記憶體洩漏 的思考
阿新 • • 發佈:2020-12-09
一:背景
1. 講故事
這段時間專案延期,加班比較厲害,部落格就稍微停了停,不過還是得持續的技術輸出呀! 園子裡最近挺熱鬧的,精緻碼農大佬分享了三篇文章:
- 為什麼要小心使用 Task.Run [https://www.cnblogs.com/willick/p/14078259.html]
- 小心使用 Task.Run 續篇 [https://www.cnblogs.com/willick/p/14100973.html]
- 小心使用 Task.Run 終篇解惑 [https://mp.weixin.qq.com/s/IMPgSsxTW0LGArfPP7rQXw]
核心程式碼如下:
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
等概念的認知比較模糊,同樣作為技術博主,得要蹭點熱度