2011-04-05 42 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