2011-04-05 38 views
1

看看Instruments中的Time Profiler仪器,看起来我在使用它们之后不会处理线程。 “所有线程”列表随着我开始线程的操作而增长。如何清理MonoTouch中的线程?

我开始我的线程如下( “线程” 是本地功能):

UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true; 

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

急件()函数是:

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进行调用到网络服务。

我还应该做些什么来消除完成后的线程?

应用程序在经过一段时间后崩溃 - 我们猜测它可能是线程 - 因为它经常启动它们以执行较短的操作。我读过MonoTouch中的监视内存使用情况,这是由于垃圾回收造成的一个挑战 - 或者我会看到内存是否也在消耗中(例如,剩余的线程)。

我使用的是MonoTouch 3.2.5和iOS 4.3.1(和Xcode 4中的工具)。应用程序需要在iOS 3.x上工作,因此我无法使用Grand Central Dispatch。

回答

1

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

2

您确定这些是您的主题吗?它更有可能是MonoTouch保留一些线程池线程以供将来的异步操作使用(例如调用Web服务中的线程池)。

+0

不,我不确定他们是我的主题。但是每当我做一个启动线程的操作时,这个数字就会增长。我已经看到它在100(之后我停止录制)。仪器说他们正在运行。是否有一种区分仪器中MT和应用程序线程的简单方法? – dommer 2011-04-05 16:41:44

+0

如果您有一个可以显示100个正在运行的线程的测试用例,那么他们应该退出时,请在http://monotouch.net/Support上提交一个错误并附上测试用例 – 2011-04-05 16:52:17

+0

我提交了一个测试应用程序给novell支持。 – dommer 2011-04-07 08:30:32

1

MonoTouch使用两种线程:使用Thread.Start手动启动的那些线程和为响应异步方法调用而创建的线程(内部许多同步操作仅仅是异步方法的包装)或创建的线程当您使用ThreadPool.QueueUserWorkItem或当您使用并行框架的默认任务调度程序。

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

当你在设备上运行时你有一个内核,所以线程的上限为N.当你在iPad 2上运行时,线程的上限为2 * N,当你在8个花式iMac上运行时核心数是8 * N。这只是Mono调整自己到更多CPU的方式。

+0

我正在分析它在3GS上,所以1核心。我在我的测试应用程序上尝试调用ThreadPool.SetMaxThreads(2,2) - 但它似乎没有改变任何事情。默认值是40/20。 – dommer 2011-04-06 08:41:53