Monotouch应用程序中的线程数

Edu*_*lho 5 c# mono xamarin.ios async-await xamarin

我在经常被调用的场景中使用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;
    }
Run Code Online (Sandbox Code Playgroud)

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

Thread finished: <Thread Pool> #149

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


编辑

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

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

Rol*_*nge 5

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

例如:

Thread started: <Thread Pool> #123
Run Code Online (Sandbox Code Playgroud)

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

相反的消息:

Thread finished: <Thread Pool> #123
Run Code Online (Sandbox Code Playgroud)

意味着该线程现在已经退出。

如果您现在创建一个新线程,您将看到以下内容:

Thread started: <Thread Pool> #124
Run Code Online (Sandbox Code Playgroud)

这意味着要了解当前正在运行的线程数,您可以计算“线程已启动”行数并减去“线程完成”行数。

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