在DotNet类库中System.Diagnostics命名空间,该命名空间提供了一些与系统进程,事件日志和性能计数器进行交互的类库。本节介绍几个比较常用的类,如果Debug类、Trace类、Process类、Stopwatch类
Debug类提供一组有助于调试代码的方法和属性。在不影响性能和代码大小的情况下使代码更可靠,使用Debug中的方法打印调试信息,并使用断言检查逻辑。
Debug类提供显示Assert对话框的方法,并发出将始终失败的断言。此类提供以下几种方法:
方法名 | 说明 |
---|---|
Write(String,String) | 将类别名称和消息写入Listerers集合中的跟踪侦听器 |
Write(Object,String) | 将类别名称和对象的ToString()方法的值写入Listerers集合中的跟踪侦听器 |
Write(String) | 将消息写入Listeners集合中的跟踪侦听器 |
Write(Object) | 将对象ToString()方法的值写入Listeners集合中的跟踪侦听器 |
方法名 | 说明 |
---|---|
Assert(Boolean) | 检查条件;如果条件为false,则显示一个消息框,其中显示调用堆栈 |
Assert(Boolean,String) | 检查条件;如果条件为 false,则输出指定消息并显示指示调用堆栈的消息框。 |
Assert(Boolean,String,String) | 检查条件 ;如果条件为 false,则输出两条指定消息,并显示一个消息框,其中显示调用堆栈。 |
Assert(Boolean,String,String,Object[]) | 检查条件;如果条件为false,则输出两条指定消息(简单消息和格式化消息),并显示一个消息框,其中会显示调用堆栈。 |
Debug.Assert方法仅使用于调试版本,Trace.Assert如果要在发布版本中执行断言,Assert(Boolean)方法用于识别程序开发期间的逻辑错误,Assert条件为false,则会向集合发送失败消息Listeners。可以通过向集合添加TraceListener或从Listeners集合中删除自定义此行为。
方法名 | 说明 |
---|---|
Fail(String) | 发出指定的错误信息 |
Fail(String,String) | 发出错误信息及详细的错误信息 |
方法名 | 说明 |
---|---|
WriteLine(String,String) | 将类别名称和消息写入Listeners集合中的跟踪侦听器 |
WriteLine(String,Object[]) | 将后跟行结束符的格式化消息写入Listeners集合中的跟踪侦听器。 |
WriteLine(String) | 将后跟行结束符的消息写入Listeners集合中的跟踪侦听器。 |
WriteLine(Object) | 将对象ToString()方法的值写入Listeners集合中的跟踪侦听器。 |
WriteLine(Object,String) | 将类别名称和对象的ToString()方法的值写入Listeners集合中的跟踪侦听器。 |
方法名 | 说明 |
---|---|
WriteLinelf(Boolean,Object,String) | 如果条件为true,则向Listeners集合中的跟踪侦听器写入类别名称和对象的ToString()方法值。 |
WriteLinelf(Boolean,Object) | 如果条件为true,则向Listeners集合中的跟踪侦听器写入对象的ToString()方法。 |
WriteLinelf(Boolean,String) | 如果条件为 true,则将消息写入Listeners集合中的跟踪侦听器 |
WriteLinelf(Boolean,String,String) | 如果条件为 true,则将类别名称和消息写入Listeners集合中的跟踪侦听器 |
可以使用语句而不是使用WriteLinelf(Boolean,String)语句来最大程度地降低检测应用程序If…Then的性能损失。
Process类提供对本地和远程进程的访问权限并使你能够启动和停止本地系统进程。Process组件提供对计算机上正在运行的进程的访问权限。用最简单的术语说,进程是一个正在运行的应用。线程是操作系统分配处理器时间的基本单元。线程可以执行进程代码的任何部分吗,包括当前由另一个线程执行的部分。
组件Proccess是用于启动、停止、控制和监视应用的有用工具。可以使用Process组件获取正在运行的进程的列表,也可以启动新进程。组件Process用于访问系统进程。Process组件初始化后,它可用于获取有关正在运行的进程的信息。此类信息包含线程集、加载的模块以及进程正在使用的内存量等性能信息。
Process类实现IDisposable接口。在使用完类型后,应直接或间接释放类型。若要直接释放类型,请在try/finally 块中调用其Dispose方法。若要间接释放类型,请使用using或using等语言构造。
属性或方法 | 说明 |
---|---|
MachineName | 属性,获取关联进程正在其上运行的计算机的名称 |
Id | 属性,获取关联进程的唯一标识符 |
ExitTime | 属性,获取关联进程退出的时间 |
ProcessName | 属性,获取该进程的名称 |
StartTime | 属性,获取关联进程启动的时间 |
Threads | 属性,获取在关联进程中运行的一组线程 |
TotalProcessorTime | 属性,获取此进程的总的处理器时间 |
UserProcessorTime | 属性,获取此进程的用户处理器时间 |
Close() | 方法,释放与此组件关联的所有资源 |
CloseMainWindow() | 方法,通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程 |
Dispose() | 方法,释放由 Component 使用的所有资源 |
GetCurrentProcess() | 方法,获取新的 Process 组件,并将其与当前活动的进程关联 |
GetProcesses() | 方法,为本地计算机上的每个进程资源创建一个新的 Process 组件 |
GetProcesses(String) | 方法,为指定计算机上的每个进程资源创建一个新的 Process 组件 |
GetProcessesByName(String) | 方法,创建新的 Process 组件的数组,并将它们与本地计算机上共享指定的进程名称的所有进程资源关联 |
Kill() | 方法,立即停止关联的进程 |
Start() | 方法,启动(或重用)此 Process 组件的 Startinfo 属性指定的进程资源, 并将其与该组件关联 |
Start(String) | 方法,通过指定文档或应用程序文件的名称来启动进程资源,并将资源与新的 Process 组件关联 |
using (Process proc = new Process())
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Console.WriteLine(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + ":" + file);
proc.StartInfo.WorkingDirectory = file;
proc.StartInfo.FileName = file + "process.exe";
//proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//这里设置DOS窗口不显示,经实践可行
//proc.StartInfo.CreateNoWindow = true;//不显示程序窗口
proc.StartInfo.UseShellExecute = false;//是否使用操作系统shell启动
proc.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
proc.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
proc.StartInfo.RedirectStandardError = true;//重定向标准错误输出
proc.Start();//启动程序
//proc.StandardInput.WriteLine("exit");//向cmd窗口写入命令
proc.StandardInput.AutoFlush = true;
proc.WaitForExit();
stopwatch.Stop();
Console.WriteLine(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + ":" + file + ",共耗时:" + stopwatch.ElapsedMilliseconds / 1000d + "s");
var msg = proc.StandardOutput.ReadToEnd();
FileStream newFs = new FileStream(file + "Output/output.txt", FileMode.Append);
StreamWriter sw = new StreamWriter(newFs, Encoding.ASCII);
sw.Write(DateTime.Now);
sw.Write(msg);
sw.Flush();
sw.Close();
newFs.Close();
proc.Close();
};
Stopwatch类提供一组方法和属性,可用于准确地测量运行时间。Stopwatch可以测量一个间隔的已用的时间,或跨多个间隔测量已用总时间。在Stopwatch方案中,调用Start方法,然后最终调用Stop方法,然后使用属性检查经过的时间Elapsed。
Stopwatch类使用IsRuning确定Stopwatch当前状态,使用Start开始测量已使用时间;使用Stop停止测量已用时间。通过属性Elapsed,ElapsedMilliseconds或ElapsedTicks查询已使用时间值。可以在实例正在运行或停止时间已用时间属性,运行时,经过的时间属性会稳步增加Stopwatch;在实例停止时他们保持不变。
默认情况下,实例已用时间等于所有测量时间间隔的总和Stopwatch.每次调用Start在积累已用时间开始计数;每次调用结束Stop当前间隔量并冻结累积已用时间值。Reset使用方法清除现有Stopwatch实例中累积已用时间。
通过Stopwatch对基础计时机制中的计时器周期进行计算来度量已用时间。如果安装的硬件和操作系统支持高分辨率性能计数器,则Stopwatch类使用该计数器来测量已用时间。否则, Stopwatch 类使用系统计时器来测量已用时间。
属性或方法 | 说明 |
---|---|
Elapsed | 获取当前实例测量得出的总运行时间。 |
ElasedMIlliseconds | 获取当前实例测量得出的总运行时间(以毫秒为单位)。 |
ElasedTicks | 获取当前实例测量得出的总运行时间(用计时器刻度表示)。 |
IsRunning | 获取一个值,该值表示Stopwatch计时器是否正在运行。 |
Reset() | 停止时间间隔测量,并将运行时间重置为零 |
Restart() | 停止时间间隔测量,将运行时间重置为零,然后开始测量运行时间 |
Start() | 开始或继续测量某个时间间隔的运行时间。 |
StartNew() | 初始化新的Stopwatch实例,将进行时间属性设置为零,然后开始测量运行时间。 |
Stop() | 停止测量某个时间间隔的运行时间 |
using System;
using System.Diagnostics;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Thread.Sleep(10000);
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
}
}