Monotouch应用程序中的线程数

时间:2013-12-07 18:13:22

标签: c# mono xamarin.ios xamarin async-await

我在我的应用程序中使用TaskTaskCompletionSource代码,这些代码经常被调用,例如从“滚动表视图”异步下载来自Internet的图像。这允许我编写async / await代码而不需要触及用于下载/缓存操作的UI线程。

e.g:

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: <Thread Pool> #149

线程的数量总是越来越大,我担心我的应用程序创建了太多的线程,并且可能因为长时间使用后被卡住了。 Thread finished: <Thread Pool> #149是什么意思?线程是否被创建和销毁?线程是否被重用?我的应用程序是否有#149直播线程?可以(应该)限制最大线程数吗?


修改

正如@usr所建议我再次运行我的应用程序并停止调试器以查看有多少线程,请参阅屏幕截图: Debugger threads Debugger console

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

1 个答案:

答案 0 :(得分:3)

Application Output中显示的线程号是创建的第n个线程,而不是第n个正在运行的线程。

例如:

Thread started: <Thread Pool> #123

意味着在整个应用程序的生命周期中,123个线程已经启动。它没有说明当前运行的线程数。

相反的信息:

Thread finished: <Thread Pool> #123

表示此线程现已退出。

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

Thread started: <Thread Pool> #124

这意味着要知道当前正在运行的线程数,可以计算“Thread started”行数并减去“Thread finished”行数。

另一种解决方案是只查看Threads pad(就像你的截图),然后计算那里的线程数。