作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 C#/.NET 3.5 程序中,我使用线程池线程(delegate+BeginInvoke/EndInvoke)来并行化和加速一些文件加载。 SystemInternals 工具 ProcessExplorer 显示进程中的线程数随着时间的推移而增加,而我希望保持不变。看起来一些线程/线程句柄无缘无故地闲逛。
有趣的是,我找不到线程如何增长的模式,而且似乎偶尔发生,每次启动应用程序时都没有可重复的模式。我花了一些时间进行分析,以下是一些观察结果:
1) 代码如下所示:
ArrayList IAsyncResult_s = new ArrayList();
AsyncProcessing thread1 = processRasterLayer;
... ArrayList filesToRender....
foreach (string FileName in filesToRender)
{
string fileName2 = FileName;
GeoImage partialImage1;
IAsyncResult asyncResult = thread1.BeginInvoke(
fileName2, .....,
out partialImage1, ..., null, null);
IAsyncResult_s.Add(asyncResult);
asyncResult = null;
}
.................
//block and render all
foreach (IAsyncResult asyncResult in IAsyncResult_s)
{
GeoImage partialImage1;
thread1.EndInvoke(
out partialImage1, , asyncResult);
//render image.. some calls to render partial image here
partialImage1.Dispose();
partialImage1 = null;
}
IAsyncResult_s.Clear();
IAsyncResult_s = null;
thread1 = null;
ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
给出像 493, 1000 这样的数字。
ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
给出数字 500, 1000。因此,可用线程的数量返回到相同
SystemInternals ProcessExplorer
报告的进程线程数和 API
System.Diagnostics.Process.GetCurrentProcess()
.Threads.Count 是循环前的 16 个,循环后的大约 21 个。
最佳答案
所以答案是:这里没有泄漏。这就是线程池的工作方式。它保留完成工作的线程,因此您下次需要线程时不必支付创建线程的费用。如果您有许多并发工作项,则池中的线程数会增加,但它们会在 MaxWorkerThreads 处达到最大值。 (它与垃圾收集器无关。)
有关更多信息,请参阅这篇文章:
http://msdn.microsoft.com/en-us/library/0ka9477y.aspx
关于c# - 未收集垃圾的线程/线程池线程/C#/.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15459099/
我是一名优秀的程序员,十分优秀!