为什么不收集在辅助线程中使用的对象

时间:2013-03-04 10:10:29

标签: c# multithreading xamarin.ios garbage-collection destructor

我有一个这样的课程:

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()之前完成第一个线程。)

1 个答案:

答案 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()返回之前运行吗?