Monotouch 应用程序中的线程数

Posted

技术标签:

【中文标题】Monotouch 应用程序中的线程数【英文标题】:Number of Threads in Monotouch application 【发布时间】:2013-12-25 00:52:45 【问题描述】:

我在我的应用程序中使用TaskTaskCompletionSource 代码,用于频繁调用的场景,例如从“滚动表视图”异步下载 Internet 上的图像。这允许我编写异步/等待代码,而无需接触 UI 线程来进行下载/缓存操作。

例如:

public override Task<object> GetCachedImage (string key)
    
        UIImage inMemoryImage = sdImageCache.ImageFromMemoryCache (key);

        //
        // Return synchronously since the image was found in the memory cache.
        if (inMemoryImage != null) 
            return Task.FromResult ((object)inMemoryImage);
        

        TaskCompletionSource<object> tsc = new TaskCompletionSource<object> ();

        //
        // Query the disk cache asynchronously, invoking the result asynchronously.
        sdImageCache.QueryDiskCache (key, (image, cacheType) => 
            tsc.TrySetResult (image);
        );

        return tsc.Task;
    

GetCachedImage 被多次调用,因为一个表格视图可能有很多要下载的图像,并且用户也可以滚动表格视图。 任务本身不会花费太长时间来执行(在某些情况下结果是同步返回的),所以我希望系统创建很多线程但也可以重用它们。但是我在控制台中看到以下输出:

Thread finished: &lt;Thread Pool&gt; #149

线程的数量总是越来越大,我担心我的应用程序创建了太多线程,并且在长时间使用后可能会因此而卡住。 Thread finished: &lt;Thread Pool&gt; #149 是什么意思?是否正在创建和销毁线程?线程是否被重用?我的应用程序是否有 #149 活动线程?我可以(应该)限制最大线程数吗?


编辑

按照@usr 的建议,我再次运行我的应用程序并停止调试器以查看那里有多少线程,请参阅屏幕截图:

看起来创建了 38 个线程,但其中一些被销毁了,对吗? 这是否意味着只要应用程序正在运行,Thread finished: &lt;Thread Pool&gt; #... 消息将始终以更大的数字出现?为什么不重复使用线程?

【问题讨论】:

为什么系统还要创建线程?我没有看到任何会在您的代码中创建线程的内容。 我不是ThreadPool 专家,但我可以在文档中看到Task 使用ThreadPool 线程在后台执行工作。问题是“为什么要创建太多线程”? 如果你使用Task.Run() 或类似的东西,当然可以。但如果您使用Task.FromResult()TaskCompletionSource,则不会,因为这样就没有工作可做。 那个线程池调试输出甚至意味着什么?我不知道。这并不一定意味着有这么多线程正在运行。暂停调试器,看看有多少线程。 我按照@usr 的建议使用调试器输出的屏幕截图编辑了我的问题。 【参考方案1】:

应用程序输出中显示的线程号是创建的第 n 个线程,而不是第 n 个正在运行的线程。

例如:

Thread started: <Thread Pool> #123

表示在整个应用程序的生命周期中已经启动了 123 个线程。它没有说明当前正在运行多少线程。

相反的信息:

Thread finished: <Thread Pool> #123

表示该线程现已退出。

如果你现在创建一个新线程,你会看到:

Thread started: <Thread Pool> #124

这意味着要知道当前有多少线程正在运行,您可以计算“线程启动”行数并减去“线程完成”行数。

另一种解决方案是只查看线程板(如您的屏幕截图),然后计算那里的线程数。

【讨论】:

以上是关于Monotouch 应用程序中的线程数的主要内容,如果未能解决你的问题,请参考以下文章

Monotouch内存限制崩溃

如何加快 MonoTouch 编译时间?

MonoTouch 中的弱事件模式

应用程序委托问题,MonoTouch

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

iOS 或 MonoTouch 中的固有内存泄漏?