句柄只是用来标识应用程序中的不同对象和同类中的不同的实例的一个数字,通常情况下,句柄值对普通用户毫无用处,但是句柄数量却可以间接反映出一个程序里产生的对象实例的多少。句柄数越多,代表程序里new 出来的对象越多。但是在c#里,经常会遇到句柄数莫名其妙的增加。

 DateTime lastTime1 = DateTime.Now.AddHours();
while (true)
{
var a = lastTime1 - DateTime.Now;
if (a.TotalHours <= )
{
break;
}
//DoSomething!
Thread.Sleep();
}

在DoSomeThing里,如果用一个委托,去更新窗体控件,会发现任务管理器里的“句柄数”一栏,值会一点点的增加。而且通常都不怎么降。

比如:

  richTextBox1.Invoke(new EventHandler(delegate
{
label3.Text ="xxxx"; }));

不管这个匿名委托里有没有代码,句柄数都会增加
但是如果使用上下文同步对象给控件发送消息,这个问题就解决了

   _syncContext.Post(ReFreshUI, a);

  private void ReFreshUI(object state)
{
try
{
label3.Text = state.ToString();
}
catch
{ }
}

而且我还发现一个有意思的问题。
那就是如果在循环里,添上对 StatusStripLabel控件进行更新的代码,句柄数也会增加,也是没有要停的意思。几分钟时间里居然升到了1000多。如果将这个控件换成Label控件,那么句柄数会保持不变。这算不算是StatusStripLabel这个控件的bug呢。

另外,还有一个可能导致句柄数增加的。就是 很多人都会和我一样,写上这样的代码:

  socket = new Socket(AddressFamily.InterNetwork, SocketType, SocketType == SocketType.Dgram ? ProtocolType.Udp : ProtocolType.Tcp);
IAsyncResult result = socket.BeginConnect(remoteEP, null, null);
if (result.AsyncWaitHandle.WaitOne(timeout, false) && socket.Connected)
{
result.AsyncWaitHandle.Close();
RemoteEndPoint = remoteEP;
return true;
}

经过测试发现。只要跑一轮这个代码,句柄数也会增加几个。而且跑完了也不会降下来。后面我想了下,result.AsyncWaitHandle就是一个WaitHandle对象,而我们知道这个对象是需要显式地释放掉才行的。
如果加上   result.AsyncWaitHandle.Close();问题就可以完美的解决了,句柄数一般都不会上升,甚至可能降一点。

c# 句柄数不断攀升的解决方案的更多相关文章

  1. Linux Shell 网络层监控脚本(监控包括:连接数、句柄数及根据监控反馈结果分析)

    脚本监控: 获取最大句柄数的进程: 链接分析: 脚本片段: case "$handle" in 2) echo "The handle of the process : ...

  2. MySQL 句柄数占用过多的解决方法

    在Windows下安装MySQL ,用了官方的配置向导生成了my.ini,本以为很安稳了,谁知十多个小时过去之后,系统响应非常慢,看资源管理器的性能卡,发现句柄数竟然达到了10万!怪不得无论使用什么程 ...

  3. linux下查看系统进程占用的句柄数

    ---查看系统默认的最大文件句柄数,系统默认是1024 # ulimit -n 1024 ----查看当前进程打开了多少句柄数 # lsof -n|awk '{print $2}'|sort|uniq ...

  4. 服务器内存占用不断的增加 & 任务管理器(PF使用率)不断的增加:关注句柄数

    最近一二个月以来,我发现服务器的内存占用正按着每天60M的速度增加. 一台windows 2003的服务器(2G内存),刚刚启起时占用内存:600M左右. 运行20天后,内存占用(PF使用):1.8G ...

  5. Windows句柄数限制

    设置 GDIProcessHandleQuota项设置GDI句柄数量,默认值为2710(16进制)/10000(10进制),该值的允许范围为 256 ~ 16384 ,将其调整为大于默认的10000的 ...

  6. ulimit设置句柄数

    这几天在做一个性能测试,写了一个模拟发送http的程序.模拟100并发的情况下,随机发http get的请求.放到服务器上运行一段时间抛出Too many open files的异常. 这几天在做一个 ...

  7. linux 服务器所支持的最大句柄数调高数倍(与服务器的内存数量相关)

    https://github.com/alibaba/p3c/blob/master/阿里巴巴Java开发手册(详尽版).pdf 2. [推荐]调大服务器所支持的最大文件句柄数(File Descri ...

  8. 修改RedHat 7.2 进程最大句柄数限制

    RedHat对进程打开文件句柄数主要通过设置全局值和登陆用户分别管理.其中/proc/sys/fs下设置全局最大文件句柄数和用户进程能打开的最大文件句柄数,这两个参数一般情况下不需要修改. 对于普通用 ...

  9. “不支持一个STA线程上针对多个句柄的WaitAll。”的解决方案

    一.异常提示 不支持一个 STA 线程上针对多个句柄的 WaitAll. 出错界面如下图: 二.解决方法 先直接上解决方案吧.其实解决方法很简单如下面的代码直接把main函数的[STAThread]属 ...

随机推荐

  1. 运行hadoop的时候提示物理内存或虚拟内存溢出的解决方案running beyond physical memory或者beyond vitual memory limits

    当运行中出现Container is running beyond physical memory这个问题出现主要是因为物理内存不足导致的,在执行mapreduce的时候,每个map和reduce都有 ...

  2. webstorm中.vue报错

    1.webstorm中es6语法报错,解决方法: 打开 Settings => Languages & Frameworks => Javascript把 Javascript L ...

  3. Linux命令之chmod

    chmod [选项] … MODE[,MODE] … FILE … chmod [选项] … OCTAL-MODE FILE … chmod [选项] … --reference=RFILE FILE ...

  4. java-多线程-一道阿里面试题分析

    这段代码大多数情况下运行正常,但是某些情况下会出问题.什么时候会出现什么问题?如何修正?可见博客 http://yueyemaitian.iteye.com/blog/1387901 1.public ...

  5. Now Task

    1. Java 多线程 首先整理基本功,如线程的状态,和调度 多线程的经典例子,包括代码在内 多线程死锁的问题,要结合数据库的例子来整理 JDK1.5的若干要点 多线程的设计模式 2. NIO 需要掌 ...

  6. JZYZOJ1535 [haoi2014]穿越封锁线

    http://172.20.6.3/Problem_Show.asp?id=1535 整体来说是道水题,但是穿过点的判定把我坑得wa了两次,考场上这可是40分的水分啊啊啊. 开始的错误想法:排序后向上 ...

  7. BZOJ 4031 [HEOI2015]小Z的房间(Matrix-Tree定理)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4031 [题目大意] 你突然有了一个大房子,房子里面有一些房间. 事实上,你的房子可以看 ...

  8. ListView EditText 实现的三种方式

    原文网址:http://blog.sina.com.cn/s/blog_682139d001013omd.html 这段时间搞一个android表格,真是搞死人,让我想到iphone开发是何其的简单啊 ...

  9. springmvc poi实现报表导出

    1.pom文件: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ ...

  10. CentOS 6.9配置网卡IP/网关/DNS命令详细介绍及一些常用网络配置命令(转)

    一.IP 即时生效(重启后失效): ifconfig eth0 192.168.1.102 netmask 255.255.255.0 //添加IP地址 route add default gw 19 ...