我有一个这样的课程:
public class SecondaryThreadClass
{
private string str;
public SecondaryThreadClass ()
{
}
~SecondaryThreadClass(){
Console.WriteLine("Secondary class's instance was destroyed");
}
public void DoJobAsync(){
new Thread(() => {
// this.str = "Hello world";
// Console.WriteLine(this.str);
Console.WriteLine("Hello world");
}).Start();
}
}
当我取消注释这两行并注释Console.WriteLine(“Hello world”);相反,我的析构函数永远不会被调用。所以看来,如果我在二级线程方法中使用“this”,我的对象就不会被收集。来电者的代码在这里:
public override void ViewDidLoad ()
{
SecondaryThreadClass instance = new SecondaryThreadClass();
instance.DoJobAsync();
base.ViewDidLoad ();
}
如何让GC收集这些对象?如果重要的话,我正在使用MonoTouch。
编辑:
public void DoJobAsync(){
new Thread(() => {
this.str = "Hello world";
Console.WriteLine(this.str);
// Console.WriteLine("Hello world");
new Thread(() => {
Thread.Sleep(2000);
GC.Collect();
GC.WaitForPendingFinalizers();
}).Start();
}).Start();
}
这也没有帮助(需要超时以确保在调用GC.Collect()之前完成第一个线程。)
答案 0 :(得分:0)
以下程序在我的系统上工作正常(非MONO)。
尝试时会发生什么?如果它不起作用,那么在你正在使用的Mono的实现中看起来很奇怪 - 这不是一个很好的答案,但至少你知道它应该工作。 ..
using System;
using System.Threading;
namespace Demo
{
class Program
{
private static void Main(string[] args)
{
SecondaryThreadClass instance = new SecondaryThreadClass();
instance.DoJobAsync();
Console.WriteLine("Press a key to GC.Collect()");
Console.ReadKey();
instance = null;
GC.Collect();
Console.WriteLine("Press a key to exit.");
Console.ReadKey();
}
}
public class SecondaryThreadClass
{
private string str;
public SecondaryThreadClass()
{
}
~SecondaryThreadClass()
{
Console.WriteLine("Secondary class's instance was destroyed");
}
public void DoJobAsync()
{
new Thread(() =>
{
this.str = "Hello world";
Console.WriteLine(this.str);
}).Start();
}
}
}
您希望GC何时运行?你不希望它在base.ViewDidLoad()
返回之前运行吗?