私はこのようなクラスを持っています:
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();
}
}
これら 2 行のコメントを外して、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() が呼び出される前に最初のスレッドが終了していることを確認するためにタイムアウトが必要です)。