【WPF系列】- System.Diagnostics命名空间

【WPF系列】- System.Diagnostics命名空间

一、概述

在DotNet类库中System.Diagnostics命名空间,该命名空间提供了一些与系统进程,事件日志和性能计数器进行交互的类库。本节介绍几个比较常用的类,如果Debug类、Trace类、Process类、Stopwatch类

二、Debug类

Debug类提供一组有助于调试代码的方法和属性。在不影响性能和代码大小的情况下使代码更可靠,使用Debug中的方法打印调试信息,并使用断言检查逻辑。

Debug类提供显示Assert对话框的方法,并发出将始终失败的断言。此类提供以下几种方法:

  • Debug.Write() 将有关调试的信息写入Listeners集合中的跟踪侦听器。有以下重载方法:
方法名说明
Write(String,String)将类别名称和消息写入Listerers集合中的跟踪侦听器
Write(Object,String)将类别名称和对象的ToString()方法的值写入Listerers集合中的跟踪侦听器
Write(String)将消息写入Listeners集合中的跟踪侦听器
Write(Object)将对象ToString()方法的值写入Listeners集合中的跟踪侦听器
  • Debug.Assert(Bool) 如果条件为false,则输出消息,并显示一个消息框,其中显示调用堆栈。如果条件为true,则不会发送失败消息,也不显示消息框。
方法名说明
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集合中删除自定义此行为。

  • Debug.Fail(String) 发送错误信息及详细的错误信息
方法名说明
Fail(String)发出指定的错误信息
Fail(String,String)发出错误信息及详细的错误信息
  • Debug.WriteLine 将有关调试的信息写入Listeners集合中的跟踪侦听器。
方法名说明
WriteLine(String,String)将类别名称和消息写入Listeners集合中的跟踪侦听器
WriteLine(String,Object[])将后跟行结束符的格式化消息写入Listeners集合中的跟踪侦听器。
WriteLine(String)将后跟行结束符的消息写入Listeners集合中的跟踪侦听器。
WriteLine(Object)将对象ToString()方法的值写入Listeners集合中的跟踪侦听器。
WriteLine(Object,String)将类别名称和对象的ToString()方法的值写入Listeners集合中的跟踪侦听器。
  • Debug.WriteLineIf如果条件为true,则将有关调试的信息写入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类提供对本地和远程进程的访问权限并使你能够启动和停止本地系统进程。Process组件提供对计算机上正在运行的进程的访问权限。用最简单的术语说,进程是一个正在运行的应用。线程是操作系统分配处理器时间的基本单元。线程可以执行进程代码的任何部分吗,包括当前由另一个线程执行的部分。

组件Proccess是用于启动、停止、控制和监视应用的有用工具。可以使用Process组件获取正在运行的进程的列表,也可以启动新进程。组件Process用于访问系统进程。Process组件初始化后,它可用于获取有关正在运行的进程的信息。此类信息包含线程集、加载的模块以及进程正在使用的内存量等性能信息。

Process类实现IDisposable接口。在使用完类型后,应直接或间接释放类型。若要直接释放类型,请在try/finally 块中调用其Dispose方法。若要间接释放类型,请使用using或using等语言构造。

Process类的常用属性和方法简介

属性或方法说明
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 组件关联

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可以测量一个间隔的已用的时间,或跨多个间隔测量已用总时间。在Stopwatch方案中,调用Start方法,然后最终调用Stop方法,然后使用属性检查经过的时间Elapsed。

Stopwatch类使用IsRuning确定Stopwatch当前状态,使用Start开始测量已使用时间;使用Stop停止测量已用时间。通过属性Elapsed,ElapsedMilliseconds或ElapsedTicks查询已使用时间值。可以在实例正在运行或停止时间已用时间属性,运行时,经过的时间属性会稳步增加Stopwatch;在实例停止时他们保持不变。

默认情况下,实例已用时间等于所有测量时间间隔的总和Stopwatch.每次调用Start在积累已用时间开始计数;每次调用结束Stop当前间隔量并冻结累积已用时间值。Reset使用方法清除现有Stopwatch实例中累积已用时间。

通过Stopwatch对基础计时机制中的计时器周期进行计算来度量已用时间。如果安装的硬件和操作系统支持高分辨率性能计数器,则Stopwatch类使用该计数器来测量已用时间。否则, Stopwatch 类使用系统计时器来测量已用时间。

Stopwatch 类的常用属性和方法简介

属性或方法说明
Elapsed获取当前实例测量得出的总运行时间。
ElasedMIlliseconds获取当前实例测量得出的总运行时间(以毫秒为单位)。
ElasedTicks获取当前实例测量得出的总运行时间(用计时器刻度表示)。
IsRunning获取一个值,该值表示Stopwatch计时器是否正在运行。
Reset()停止时间间隔测量,并将运行时间重置为零
Restart()停止时间间隔测量,将运行时间重置为零,然后开始测量运行时间
Start()开始或继续测量某个时间间隔的运行时间。
StartNew()初始化新的Stopwatch实例,将进行时间属性设置为零,然后开始测量运行时间。
Stop()停止测量某个时间间隔的运行时间

Stopwatch 类使用实例

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);
    }
}
WPF 秒表 计时器 定时关机 到计时关机 public const uint WM_SYSCOMMAND = 0x0112; public const uint SC_MONITORPOWER = 0xF170; [DllImport("user32")] public static extern IntPtr SendMessage(IntPtr hWnd, uint wMsg, uint wParam, int lParam); /// /// 关闭显示器 /// public void CloseScreen() { IntPtr windowHandle = Process.GetCurrentProcess().MainWindowHandle; SendMessage(windowHandle, WM_SYSCOMMAND, SC_MONITORPOWER, 2); // 2 为关闭显示器, -1则打开显示器 } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; using IniFiles; namespace StopWatch { /// /// shutdonwCtrl.xaml 的交互逻辑 /// public partial class shutdonwCtrl : UserControl { DispatcherTimer timer1; DispatcherTimer timer2; public shutdonwCtrl() { InitializeComponent(); timer1 = new DispatcherTimer(); timer1.Tick += new EventHandler(OnTimer1); timer1.Interval = new TimeSpan(0, 0, 1); timer2 = new DispatcherTimer(); timer2.Tick += new EventHandler(OnTimer2); timer2.Interval = new TimeSpan(0, 0, 1); btn_cancel.IsEnabled = false; cancel1.IsEnabled = false; } IniFile INI = new IniFile(IniFile.AppIniName); public void LoadIni() { cbo_hour.Text = INI.ReadString("定时关机", "时", "0"); cbo_Minute.Text = INI.ReadString("定时关机", "分", "0"); cbo_Second.Text = INI.ReadString("定时关机", "秒", "0"); cbo1.Text = INI.ReadString("到计时关机", "分", "0"); //combobox1.Text = INI.ReadString("到计时", "时", "0"); //combobox2.Text = INI.ReadString("到计时", "分", "0"); //combobox3.Text = INI.ReadString("到计时", "秒", "0"); } public void SaveIni() { INI.WriteString("定时关机", "时", cbo_hour.Text); INI.WriteString("定时关机", "分", cbo_Minute.Text); INI.WriteString("定时关机", "秒", cbo_Second.Text); INI.WriteString("到计时关机", "分", cbo1.Text); } private void ShutDown() { System.Diagnostics.Process.Start("shutdown.exe", "-s -t 1"); } private void OnTimer1(object sender,EventArgs e) { if (second > 0) second--; label1.Content = string.Format("Windows将在 {0} 关机", TimerClass.GetTimeString1(second)); if (second <= 0 && !cbo1.IsEnabled) { ShutDown(); } } int second = 0; private void Button_Click(object sender, RoutedEventArgs e) { second = Convert.ToInt32(cbo1.Text) * 60; if (second <= 0) { MessageBox.Show("数值必须大于0!"); return; } timer1.Start(); cbo1.IsEnabled = false; cancel1.IsEnabled = true; start1.IsEnabled = false; } private void Button_Click_1(object sender, RoutedEventArgs e) { label1.Content = " "; timer1.Stop(); second = 0; cbo1.IsEnabled = true; cancel1.IsEnabled = false; start1.IsEnabled = true; } private void OnTimer2(object sender, EventArgs e) { if ( DateTime.Now.Hour == Convert.ToInt32(cbo_hour.Text) && DateTime.Now.Minute == Convert.ToInt32(cbo_Minute.Text) && DateTime.Now.Second == Convert.ToInt32(cbo_Second.Text) ) { ShutDown(); } } private void Button_Click_2(object sender, RoutedEventArgs e) { int s = Convert.ToInt32(cbo_hour.Text) * 3600 + Convert.ToInt32(cbo_Minute.Text) * 60 + Convert.ToInt32(cbo_Second.Text); timer2.Start(); label2.Content = string.Format("Windows将在 {0} 关机", TimerClass.GetTimeString1(s)); btn_start.IsEnabled = false; btn_cancel.IsEnabled = true; cbo_hour.IsEnabled = false; cbo_Minute.IsEnabled = false; cbo_Second.IsEnabled = false; } private void btn_cancel_Click(object sender, RoutedEventArgs e) { label2.Content = ""; timer2.Stop(); btn_start.IsEnabled = true; btn_cancel.IsEnabled = false; cbo_hour.IsEnabled = true; cbo_Minute.IsEnabled = true; cbo_Second.IsEnabled = true; } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Threading.Tasks; using System.Runtime.InteropServices; using System.Windows.Threading; using IniFiles; namespace StopWatch { /// /// TimerCtrl.xaml 的交互逻辑 /// public partial class TimerCtrl : UserControl { private DispatcherTimer timer1 = null; private DispatcherTimer timer2 = null; int SND_SYNC = 0x0000; /* play asynchronously */ //异步 int SND_ASYNC = 0x0001; int SND_LOOP = 8; [DllImport("winmm")] public static extern bool PlaySound(string szSound, IntPtr hMod, int flags); private void playSound3() { Task tsk = new Task(new Action(proc)); tsk.Start(); } private void proc() { PlaySound(@"Sound\2.wav", IntPtr.Zero, SND_SYNC); PlaySound(@"Sound\2.wav", IntPtr.Zero, SND_SYNC); PlaySound(@"Sound\2.wav", IntPtr.Zero, SND_SYNC); } public TimerCtrl() { InitializeComponent(); timer1 = new DispatcherTimer(); timer1.Tick += new EventHandler(OnTimer1); timer1.Interval = new TimeSpan(0, 0, 1); timer2 = new DispatcherTimer(); timer2.Tick += new EventHandler(OnTimer2); timer2.Interval = new TimeSpan(0, 0, 1); btn_reset1.IsEnabled = false; btn_pause1.IsEnabled = false; } int h = 0; int m = 0; int s = 0; int seconds = 0; private void OnTimer1(object sender, EventArgs e) { if (seconds < 1) { PlaySound(@"Sound\2.wav", IntPtr.Zero, SND_ASYNC); btn_start.IsEnabled = false; btn_reset1.IsEnabled = true; btn_pause1.IsEnabled = false; combobox1.IsEnabled = true; combobox2.IsEnabled = true; combobox3.IsEnabled = true; return; } seconds--; label1.Content = TimerClass.GetTimeString1(seconds); } private void btn_start_Click(object sender, RoutedEventArgs e) { h = Convert.ToInt32(combobox1.Text); m = Convert.ToInt32(combobox2.Text); s = Convert.ToInt32(combobox3.Text); seconds = h * 3600 + m * 60 + s; label1.Content = TimerClass.GetTimeString1(seconds); timer1.Start(); btn_start.IsEnabled = false; btn_reset1.IsEnabled = true; btn_pause1.IsEnabled = true; combobox1.IsEnabled = false; combobox2.IsEnabled = false; combobox3.IsEnabled = false; } private void btn_reset_Click(object sender, RoutedEventArgs e) { seconds = 0; label1.Content = TimerClass.GetTimeString1(seconds); timer1.Stop(); btn_start.IsEnabled = true; btn_reset1.IsEnabled = false; btn_pause1.IsEnabled = false; combobox1.IsEnabled = true; combobox2.IsEnabled = true; combobox3.IsEnabled = true; } private void pause1_Click(object sender, RoutedEventArgs e) { if (btn_pause1.Content.ToString() == "暂停") { timer1.Stop(); btn_pause1.Content = "继续"; } else { timer1.Start(); btn_pause1.Content = "暂停"; } } int SEC = 0; private void OnTimer2(object sender, EventArgs e) { if (SEC < 1) { timer2.Stop(); playSound3(); btn_quick.IsEnabled = true; btn_cancel2.IsEnabled = false; combobox4.IsEnabled = true; return; } SEC--; label4.Content = TimerClass.GetTimeString1(SEC); } private void Button_Click(object sender, RoutedEventArgs e) { SEC = Convert.ToInt32(combobox4.Text) * 60; timer2.Start(); combobox4.IsEnabled = false; btn_quick.IsEnabled = false; btn_cancel2.IsEnabled = true; } private void Button_Click_1(object sender, RoutedEventArgs e) { SEC = 2; label4.Content = "00:00:00"; timer2.Stop(); combobox4.IsEnabled = true; btn_quick.IsEnabled = true; } IniFile INI = new IniFile(IniFile.AppIniName); public void LoadIni() { combobox1.Text = INI.ReadString("到计时", "时", "0"); combobox2.Text = INI.ReadString("到计时", "分", "0"); combobox4.Text = INI.ReadString("快速计时", "分", "0"); } public void SaveIni() { INI.WriteString("到计时", "时", combobox1.Text); INI.WriteString("到计时", "分", combobox2.Text); INI.WriteString("到计时", "秒", combobox3.Text); INI.WriteString("快速计时", "分", combobox4.Text); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Threading; using System.Windows.Threading; namespace StopWatch { /// /// WatchCtrl.xaml 的交互逻辑 /// public partial class WatchCtrl : UserControl { public WatchCtrl() { InitializeComponent(); timer1 = new DispatcherTimer(); timer1.Tick += new EventHandler(OnTimer1); timer1.Interval = new TimeSpan(0, 0, 1); timer1_1 = new DispatcherTimer(); timer1_1.Tick += new EventHandler(OnTimer1_1); timer1_1.Interval = new TimeSpan(0, 0, 0, 100); timer2 = new DispatcherTimer(); timer2.Tick += new EventHandler(OnTimer2); timer2.Interval = new TimeSpan(0, 0, 1); } private DispatcherTimer timer1 = null; private DispatcherTimer timer1_1 = null; private DispatcherTimer timer2 = null; private void OnTimer1(object sender, EventArgs e) { second++; label1.Content = TimerClass.GetTimeString1(second) ;//DateTime.Now.ToString("h:mm:ss"); } public int second = 0; private int second1 = 0; public int count = 0; private void OnTimer1_1(object sender, EventArgs e) { //label1.Content = TimerClass.GetTimeString1(second) + "." + count.ToString();//DateTime.Now.ToString("h:mm:ss"); //count++; //if (count > 9) // count = 0; } private void OnTimer2(object sender, EventArgs e) { second1++; label2.Content = TimerClass.GetTimeString1(second1) ;//.ToString("h:mm:ss"); } private void btn_start_Click(object sender, RoutedEventArgs e) { timer1.Start(); timer2.Start(); if (btn_start.Content.ToString() == "停止") { btn_start.Content = "开始"; btn_reset.Content = "复位"; timer1.Stop(); timer2.Stop(); } else { btn_start.Content = "停止"; btn_reset.Content = "计次"; } } private int counter = 0; private void btn_reset_Click(object sender, RoutedEventArgs e) { if (btn_reset.Content.ToString() == "复位") { second = 0; second1 = 0; label1.Content = "00:00:00"; label2.Content = "00:00:00"; timer1.Stop(); timer2.Stop(); } else { if (second1 > 0) { counter++; listbox1.Items.Add(string.Format(" {0}\t{1}", counter, label2.Content)); } second1 = 0; label2.Content = "00:00:00"; } if (btn_reset.Content.ToString() == "复位" && btn_start.Content.ToString()=="开始") { listbox1.Items.Clear(); } } } }
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

goyeer(工蚁)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值