如何清理 MonoTouch 中的线程?

Posted

技术标签:

【中文标题】如何清理 MonoTouch 中的线程?【英文标题】:How do I clean up threads in MonoTouch? 【发布时间】:2011-04-05 13:35:45 【问题描述】:

查看 Instruments 中的 Time Profiler 工具,看起来我在使用线程后并没有处理它们。随着我执行启动线程的操作,“所有线程”列表会增加。

我按如下方式开始我的线程(“线程”是函数本地的):

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。

【问题讨论】:

【参考方案1】:

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

【讨论】:

不,我不确定它们是我的线程,我猜。但是每次我执行启动线程的操作时,这个数字都会增加。我在 100 处看到它(之后我停止录制)。 Instruments 说他们正在运行。有没有一种简单的方法来区分 Instruments 中的 MT 和应用线程? 如果您有一个可以显示 100 个运行线程的测试用例,当它们应该退出时,请在monotouch.net/Support 提交错误并附上测试用例 我向 Novell 支持提交了一个测试应用程序。 我通过电子邮件将其发送至 monotouch@novell.com。【参考方案2】:

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

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

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

【讨论】:

我在 3GS 上分析它,所以 1 个核心。我尝试在我的测试应用程序上调用 ThreadPool.SetMaxThreads(2, 2) - 但它似乎并没有改变事情。默认值为 40/20。【参考方案3】:

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

【讨论】:

以上是关于如何清理 MonoTouch 中的线程?的主要内容,如果未能解决你的问题,请参考以下文章

MonoTouch 中的弱事件模式

如何运行一个后台线程来定期清理列表中的一些元素?

线程/计时器的 MonoTouch 内存问题

Monotouch:不时在单独的线程崩溃中渲染 PDF 页面预览

如何限制 MonoTouch 中的 UITextView 字符限制? [复制]

MonoTouch 中的自定义标签栏项目