對 精緻碼農大佬 說的 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]
核心程式碼如下:
``` C#
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` 等概念的認知比較模糊,同樣作為技術博主,得要蹭點熱度