我在我的应用程序中使用Task
和TaskCompletionSource
代码,这些代码经常被调用,例如从“滚动表视图”异步下载来自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所建议我再次运行我的应用程序并停止调试器以查看有多少线程,请参阅屏幕截图:
看起来创建了38个线程,但其中一些被销毁了,我是对的?
这是否意味着只要应用程序正在运行,Thread finished: <Thread Pool> #...
消息将始终显示更大的数字?为什么不重复使用线程?
答案 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(就像你的截图),然后计算那里的线程数。