如何清理MonoTouch中的线程?

时间:2011-04-05 13:35:46

标签: c# iphone multithreading xamarin.ios

查看Instruments中的Time Profiler仪器,看起来我在使用它之后没有处理线程。 “所有线程”列表随着我开始执行线程的操作而增长。

我按如下方式启动我的线程(“thread”是函数的本地):

UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;

Thread thread = new Thread(Dispatch);
thread.Start();

Dispatch()函数是:

private void Dispatch()
{
    using (NSAutoreleasePool autoreleasePool = new NSAutoreleasePool())
    {
        try
        {
            // Calls a web service.
            _workDispatcher.Dispatch();
        }
        finally
        {
            // Resets network activity indicator after thread complete.
            InvokeOnMainThread(() => { UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false; });
        }
    }
}

_workerDispatcher.Dispatch调用Web服务。

我还应该做些什么来在完成时销毁线程?

应用程序在很长一段时间后崩溃 - 我们猜测它可能是线程 - 因为它会定期启动它们以进行短暂的操作。我已经读过监视MonoTouch中的内存使用量是一个挑战,因为垃圾收集 - 或者我会看到内存是否也被消耗(例如,剩余的线程)。

我正在使用MonoTouch 3.2.5和iOS 4.3.1(以及Xcode 4中的Instruments)。应用程序需要在iOS 3.x上运行,因此我无法使用Grand Central Dispatch。

3 个答案:

答案 0 :(得分:2)

你确定这些是你的主题吗? MonoTouch更有可能为未来的异步操作保留一些线程池线程(比如调用Web服务的那个)。

答案 1 :(得分:2)

MonoTouch使用两种线程:您使用Thread.Start手动启动的线程以及响应异步方法调用而按需创建的线程(内部许多同步操作仅仅是异步操作的包装)或者在创建时您使用ThreadPool.QueueUserWorkItem或使用Parallel Framework的默认任务调度程序。

您可能会看到的是ThreadPool线程,它们自动配置为每个CPU N(我不记得实际的数字,但您可以通过ThreadPool中的属性找到)。

当您在设备上运行时,您只有一个核心,因此线程的上限为N.当您在iPad 2上运行时,线程的上限为2 * N,当您在8个核心的花式iMac上运行时那个数字是8 * N.这只是Mono调整自身以适应更多CPU的方式。

答案 2 :(得分:1)

看起来这是垃圾收集问题。如果我在线程完成后调用GC.Collect(),则线程数似乎不会继续增长。