如何清理 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:不时在单独的线程崩溃中渲染 PDF 页面预览