Bas*_*ili 2 .net c# garbage-collection
我有以下代码:
public class Program
{
private static Task task;
private static int counter = 0;
private static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
if (task == null)
{
Console.WriteLine(++counter);
}
using (task = new Task(Method))
{
task.Start();
task.Wait();
}
// task = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
Console.ReadKey();
}
public static void Method() { }
}
Run Code Online (Sandbox Code Playgroud)
我的例外输出:1 2 3 4 5 6 ...但此方法的实际输出为1!
如果我从代码行中删除注释,Task = null;那么我将成为预期的结果.
为什么处理的任务不为空!?我想,如果对象被处理掉,那么它们可以从GC设置为null(我已经强制GC收集),换句话说GC会收集处理过的(孤儿)对象并将它们置为空?!
你为什么期望它被设置为null?using/ Dispose()从不说它会那样做.它承诺处置它.这里的最佳做法是在using语句中使用单独的变量以避免混淆:
using(var t = new Task(Method))
{
t.Start();
t.Wait();
}
Run Code Online (Sandbox Code Playgroud)
但是如果你想要它设置为null; 将其设置为null:
task = null;
Run Code Online (Sandbox Code Playgroud)
至于你的另一点:
换句话说,GC将收集处置的(孤儿)对象并将它们置为空?!
GC从不设置任何东西null; 它收集无法到达的东西:就是这样
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |