.NET 内部效能插件

原创 2013年12月12日 14:36:31

简介

这篇文章将介绍一个自制的简易插件。

因为在release版用windows的task manager感觉很麻烦,每次都要找一下自己的程序,就临时想到乾脆做一个简单的小插件来玩玩。

如何使用

static void Main()
{
    PerformanceDetector.Instance.initialize();
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new frmMain());
    PerformanceDetector.Instance.destroy();
} 

开启工程中的Program.cs,然后于Main中加入两行代码。

PerformanceDetector.Instance.initialize(); 

PerformanceDetector.Instance.destroy(); 


将第一行代码加于Application.Run()之前,将第二行代码加于Application.Run()之后。

就可以在运行时透过Alt+Ctrl+M呼叫这个插件了。

关于这插件的构想

因为不喜欢每次都用Task Manager,就自己整个了内存监控的代码。

一开始只是想说做个在应用内监控内存使用量的代码。所以使用Process来获取内存使用量。

但又觉得每次都去打开Log档来看很麻烦,就想说做个UI来看好了。

然后又想说,那要怎么显示这个控件?想了想既不想做在Menu也不想用一个按钮或其他控件,最后就决定用快捷来处理了。

不过第一版没有仔细想好,搞了个占据了全部画面的控件。用了才发现这样也不能边操作边看用量,好吧,重做。

所以最后决定了,就用一个单一的窗口来显示,会比较乾净。

想说CPU使用量也可以一起监控,就顺便做了。

本来是有在考虑原本第一版做的比较详细的需不需要有,但后来想想目前似乎还用不到,于是最后做成这样。

这工具中使用的技术

第一个关于CPU的使用部分,用的是PerformaceCounter来处理的

theCPUCounter = new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName);
m_cpuUsage = (int)(theCPUCounter.NextValue() / Environment.ProcessorCount); 

public PerformanceCounter(
	string categoryName,
	string counterName,
	string instanceName )  


我需要抓的是当前进程的CPU使用率,所以第一个参数用"Process",第二个参数用"% Processor Time",第三个进程则是用当前进程的名称。

利用Process.GetCurrentProcess().ProcessName取得。

只要呼叫PerformanceCounter.NextValue()就可以取得CPU使用率,并透过Enviroment.ProcessorCount来计算。

另外由于我是利用快捷键的方式来显示窗口。所以利用了Hook来拦截按键。

HookManager.Instance.RegisterHook(HookType.WH_KEYBOARD, new CustomHookProc.HookProcHandler(KeyboardHookProc));

void KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
    KeyStateInfo ctrlKey = KeyboardInfo.GetKeyState(Keys.ControlKey);
    KeyStateInfo altKey = KeyboardInfo.GetKeyState(Keys.Alt);
    KeyStateInfo mKey = KeyboardInfo.GetKeyState(Keys.M);
    if (ctrlKey.IsPressed && altKey.IsPressed && mKey.IsPressed)
    {
        showMonitorForm();
    }
} 

HookManager是我自己封装过的一个简易Hook类,只需透过注册事件即可使用。

最后是利用Process.WorkingSet64来取得进程内存。

Process currentProcess = Process.GetCurrentProcess();
currentProcess.WorkingSet64; 

以及使用Process.Modules跟ProcessModule.ModuleMemorySize来取得相关DLL的使用内存。


ProcessModuleCollection myProcessModuleCollection = currentProcess.Modules;
// Display the 'ModuleMemorySize' of each of the modules.
ProcessModule myProcessModule;
for (int i = 0; i < myProcessModuleCollection.Count; i++)
{
    myProcessModule = myProcessModuleCollection[i];
    if (m_moduleMemorys.Keys.Contains(myProcessModule.ModuleName))
        m_moduleMemorys[myProcessModule.ModuleName].update(myProcessModule.ModuleMemorySize);
    else
    {
        MemoryInfo mem = new MemoryInfo();
        mem.Name = myProcessModule.ModuleName;
        mem.update(myProcessModule.ModuleMemorySize);
        m_moduleMemorys[myProcessModule.ModuleName] = mem;
    }
} 


public class MemoryInfo
{
    string m_name;
    long m_currentUsage;
    long m_maximumUsage;
    public long MaximumUsage
    {
        get { return m_maximumUsage; }
        set { m_maximumUsage = value; }
    }
    public long CurrentUsage
    {
        get { return m_currentUsage; }
        set { m_currentUsage = value; }
    }
    public string Name
    {
        get { return m_name; }
        set { m_name = value; }
    }
    public string GetCurrentKB()
    {
        return Convert.ToString(m_currentUsage / 1024.0);
    }
    public string GetMaximumKB()
    {
        return Convert.ToString(m_maximumUsage / 1024.0);
    }
    public void update(long current)
    {
        m_currentUsage = current;
        if (m_currentUsage > m_maximumUsage)
            m_maximumUsage = m_currentUsage;
    }
} 


在代码中,声明了一个简单的类,来储存信息。

Name: 储存 ProcessModule.ModuleName。

CurrentUsage: 储存现在内存用量。

MaximumUsage: 储存最大内存用量。

代码下载


相关文章推荐

打造高效能的.NET應用程式

  • 2014年08月07日 00:54
  • 1.56MB
  • 下载

asp.net Repeater等数据控件模版内部2个DropDownList控件级联

1、新建一个从DropDownList继承的扩展类CommandableDropDownList.cs,代码如下: using System; using System.Collections.Ge...

强大的.NET反编译工具Reflector及插件!

刚接触.net 时就听说 Reflector这个强大反编译工具呢,只是一直没有去使用他. 本来本人对新鲜事就非常有兴趣,听他这么一说.决定试一试这个传说中的工具. 今天有空就用了一下.我用的版本是4....

强大的.NET反编译工具Reflector及插件!

强大的.NET反编译工具Reflector及插件! 刚接触.net 时就听说 Reflector这个强大反编译工具呢,只是一直没有去使用他. 本来本人对新鲜事就非常有兴趣,听他这么一说.决定试一试这个...
  • sscsgss
  • sscsgss
  • 2011年07月17日 09:31
  • 392

ASP.NET MVC 4 插件化架构简单实现-实例篇

先回顾一下上篇决定的做法: 1、定义程序集搜索目录(临时目录)。 2、将要使用的各种程序集(插件)复制到该目录。 3、加载临时目录中的程序集。 4、定义模板引擎的搜索路径。 5、在模板引擎的...
  • hao_ds
  • hao_ds
  • 2014年12月23日 15:14
  • 3833

构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(56)-插件---单文件上传与easyui使用fancybox

系列目录 https://yunpan.cn/cxMmigQA2cLVY  访问密码 13dc 今天整合lightbox插件Fancybox1.3.4,发现1.3.4版本太老了。而目前easyui...
  • ymnets
  • ymnets
  • 2016年02月22日 13:01
  • 739

采用Reflector的VS.net插件断点调试无源码DLL

.Net的编程利器Reflector可以反编译基于.net开发的应用程序和DLL,其功能强大不用多说。今天想试验一把利用VS.net的插件断点调试外部无源码的DLL(只要是程序集都可以,所以exe也行...

Elmah .net 最方便最好用的日志,异常记录插件

首先需要下载 Elmah.dll 并引用到项目中. 然后在web.config中配置启用 Elmah 配置项如下. web.config...
  • phker
  • phker
  • 2015年03月05日 09:32
  • 2187

zTree -- jQuery 树插件(后台异步获取数据-asp.net mvc模式下)

一,使用前需要引入的脚本文件(可从官网下载:http://www.ztree.me/v3/main.php#_zTreeInfo) 二、 2.1 前台html页面           ...

asp.net中利用jQuery Form插件上传文件

jQuery Form Plugin:http://pan.baidu.com/s/1jG81W3O jquery-1.8.3.min.js:
  • Joyhen
  • Joyhen
  • 2014年05月06日 11:24
  • 3562
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.NET 内部效能插件
举报原因:
原因补充:

(最多只允许输入30个字)