句柄只是用来标识应用程序中的不同对象和同类中的不同的实例的一个数字,通常情况下,句柄值对普通用户毫无用处,但是句柄数量却可以间接反映出一个程序里产生的对象实例的多少。句柄数越多,代表程序里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. Codeforces 1082 C. Multi-Subject Competition-有点意思 (Educational Codeforces Round 55 (Rated for Div. 2))

    C. Multi-Subject Competition time limit per test 2 seconds memory limit per test 256 megabytes input ...

  2. 【应用】wamp3.x.x设置,让外网能够访问本服务器

    开始教程前,先来看一看本机的运行环境. WAMP 32位版 3.0.6 WIN7 x86 企业版 其他VC运行库全部安装,NET装了3.5以及4.0,还有一些运行库这里省略 ——我是华丽的分割线——— ...

  3. HDU 5862 Counting Intersections(离散化 + 树状数组)

    Counting Intersections Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  4. 【BZOJ 1060】 1060: [ZJOI2007]时态同步 (树形DP)

    1060: [ZJOI2007]时态同步 Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数 字1,2,3….进行标号.电路板的各 ...

  5. 【动态规划】【记忆化搜索】hdu5965 扫雷

    f(i,j,k)表示第i行,放的雷的状态为j{0表示不放,1表示往上放,2表示往下放,3表示上下都放},剩余还有k(0<=k<=2)个要放的方案数. 先给出我这个sb写的错误代码,死都没调 ...

  6. NHibernate 操作视图 第十三篇

    在NHibernate中,可以把视图当表一样操作,只需要记住一点就是,视图是只读的,因此映射实体的setter应该改为protected. 新建一个视图如下: 持久化类: public class C ...

  7. SQL Server 2012的内部原理和故障排除(50):Burgess_Liu的专栏

    http://blog.csdn.net/Burgess_Liu/article/category/1821435/2 http://www.cnblogs.com/fygh/archive/2012 ...

  8. 【IntelliJ IDEA】在idea上操作 git分支合并【如何将远程swagger分支 合并到 远程 master分支上】【如何切换 本地分支】

    ============================================ 明确一点: 如果项目交给git管理了[如何将项目交给git管理:https://www.cnblogs.com ...

  9. 利用require.js实现javascript模块化加载

    这种引入很看到很想死吧! <script src="1.js"></script> <script src="2.js">& ...

  10. RapidXml使用方法

    一.写xml 文件 [cpp] view plaincopy #include <iostream> #include "rapidxml/rapidxml.hpp" ...