【发布时间】:2020-06-19 06:49:56
【问题描述】:
public class Cls
{
public object Obj { get; set; }
public async void Func()
{
Task.Run(() =>
{
Thread.Sleep(999999999);
this.Obj = new { };
});
}
}
public class Program
{
public static void Main(string[] args)
{
new Cls().Func();
}
}
请先考虑上面的代码,如果有意义,请忽略。在上述情况下,我没有将Cls 的实例存储到任何变量中,似乎没有任何东西引用该实例,它将是 GC。但是,Func 旁边有一个Task.Run()。 Task 的回调函数引用了实例的Obj 属性。在这种情况下,我还能被 GC 收集吗?
我问这个问题是因为在 SignalR 的 Microsoft doc 中声明
在调用依赖于集线器保持活动状态的异步方法时使用等待。
我不明白,只要Clients.All.SendAsync 内部的某些东西引用了Hub 本身,Hub 怎么会不存在...
谢谢。
【问题讨论】:
-
哪个回调?
-
你的程序先结束,没有
Cls不会在任务运行时被垃圾回收。只是你打电话给this的事实阻止了它,除其他外...... -
@Gusman Task.Run 中的 lambda 函数
-
对于每个方法调用,SignalR 都会创建一个
Hub类的新实例。在该方法调用结束后,SignalR 将Dispose那个Hub实例。所以如果你不await和async调用它只会启动它而不等待完成,然后在Hub实例上调用Dispose。这个Dispose直接从 SignalR 框架调用,因此与 GarbageCollection 无关,并且引用了Hub。 -
因此,您的问题的答案是“不,如果有对
Hub的有效引用,GC 将不会收集它,但它会被处理掉,因此不再‘活着’ "
标签: c# multithreading async-await garbage-collection