3

私はこのようなクラスを持っています:

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() が呼び出される前に最初のスレッドが終了していることを確認するためにタイムアウトが必要です)。

4

1 に答える 1

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()は思っていませんか?

于 2013-03-04T10:29:26.040 に答える