c# – Monotouch应用程序中的线程数

前端之家收集整理的这篇文章主要介绍了c# – Monotouch应用程序中的线程数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我的应用程序中使用Task和TaskCompletionSource代码,这些代码经常被调用,例如从“滚动表视图”异步下载来自Internet的图像.这允许我编写async / await代码而不需要触及用于下载/缓存操作的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被多次调用,因为表视图可能有许多要下载的图像,用户也可以滚动表视图.
任务本身不需要太长时间来执行(在某些情况下,结果是同步返回的),所以我希望系统创建大量线程但也可以重新使用它们.但是我在控制台中看到以下输出

线程完成:<线程池> #149

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

编辑

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

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

解决方法

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

例如:

Thread started: <Thread Pool> #123

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

相反的信息:

Thread finished: <Thread Pool> #123

表示此线程现已退出.

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

Thread started: <Thread Pool> #124

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

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

猜你在找的C#相关文章