2 using System.Collections.Generic;
3 using System.Diagnostics;
10 /// これを設定しておくと、スレッドID の横に "(<名前>)" と出力されるようになる。
12 public static void 現在のスレッドに名前をつける( string 名前 )
14 var ID = Log.GetCurrentThreadId();
16 if( Log.IDto名前.ContainsKey( ID ) )
17 Log.IDto名前.Remove( ID );
19 Log.IDto名前.Add( ID, 名前 );
22 public static void Info( string 出力 )
24 Log.一定時間が経過していたら区切り線を表示する();
25 Trace.TraceInformation( $"{Log.日時とスレッドID}{Log.インデックスを返す(Log.深さ)}{出力}" );
27 public static void ERROR( string 出力 )
29 Log.一定時間が経過していたら区切り線を表示する();
30 Trace.TraceError( $"{Log.日時とスレッドID} {出力}" );
32 public static void WARNING( string 出力 )
34 Log.一定時間が経過していたら区切り線を表示する();
35 Trace.TraceWarning( $"{Log.日時とスレッドID} {出力}" );
37 public static void BeginInfo( string 開始ブロック名 )
39 Log.一定時間が経過していたら区切り線を表示する();
40 Trace.TraceInformation( $"{Log.日時とスレッドID}{Log.インデックスを返す( Log.深さ )}{開始ブロック名} --> 開始" );
44 public static void EndInfo( string 終了ブロック名 )
46 Log.深さ = Math.Max( --Log.深さ, 0 );
48 Log.一定時間が経過していたら区切り線を表示する();
49 Trace.TraceInformation( $"{Log.日時とスレッドID}{Log.インデックスを返す( Log.深さ )}{終了ブロック名} <-- 終了" );
53 /// 連続して呼び出しても、前回の同一識別キーでの表示から一定時間が経たないと表示しないInfoメソッド。
56 /// 毎秒60回の進行描画の進捗など、連続して呼び出すと膨大な数のログが出力されてしまう場合に使用する。
58 /// <param name="識別キー"></param>
59 /// <param name="出力"></param>
60 public static void 定間隔Info( string 識別キー, string 出力, double 間隔sec = 0.25 )
62 if( Log.識別キー別最終表示時刻.ContainsKey( 識別キー ) )
64 if( ( DateTime.Now - Log.識別キー別最終表示時刻[ 識別キー ] ).TotalSeconds >= 間隔sec )
66 Log.識別キー別最終表示時刻[ 識別キー ] = DateTime.Now;
67 Trace.TraceInformation( $"{Log.日時とスレッドID} {出力}" );
72 Log.識別キー別最終表示時刻.Add( 識別キー, DateTime.Now );
73 Trace.TraceInformation( $"{Log.日時とスレッドID} {出力}" );
77 private static string 日時とスレッドID
81 var NETスレッドID = System.Threading.Thread.CurrentThread.ManagedThreadId;
82 var Win32スレッドID = Log.GetCurrentThreadId();
83 var スレッド識別文字列 = ( Log.IDto名前.ContainsKey( Win32スレッドID ) ) ? $"({Log.IDto名前[ Win32スレッドID ]})" : "";
84 return $"{DateTime.Now.ToLongTimeString()} [{NETスレッドID:00},0x{Win32スレッドID:x}{スレッド識別文字列}]";
87 private static readonly Dictionary<uint, string> IDto名前 = new Dictionary<uint, string>();
88 private static Dictionary<string, DateTime> 識別キー別最終表示時刻 = new Dictionary<string, DateTime>();
89 private static TimeSpan 経過時間
93 var 現在時刻 = DateTime.Now;
94 var 経過時間 = 現在時刻 - Log.最終表示時刻;
95 Log.最終表示時刻 = 現在時刻; // 更新
99 private static DateTime 最終表示時刻 = DateTime.Now;
100 private const double 最小区切り時間 = 2.0; // 区切り線を入れる最小の間隔[秒]。
101 private static int 深さ = 0;
103 private static void 一定時間が経過していたら区切り線を表示する()
105 if( Log.最小区切り時間 < Log.経過時間.TotalSeconds )
106 Trace.TraceInformation( "・・・" );
108 private static string インデックスを返す( int 長さ )
114 index += " ".Substring( 0, Math.Min( len, 10 ) );
120 #region " Win32 API "
122 [System.Runtime.InteropServices.DllImport( "kernel32.dll" )]
123 private static extern uint GetCurrentThreadId();