基本的には、私のコードで起動されていない外部プロセスの実行時間を計測したいと思います。これを達成するために、私は、特定のプロセスの開始のイベントをサブスクライブし、終了、プロセス名で、(このanswerに基づいて)次のコードを使用しています:プロセスの実行時間に間違った値が入っているのはなぜですか?
private ManagementEventWatcher ProcessStartWatcher(string processName)
{
string queryString =
"SELECT TargetInstance" +
" FROM __InstanceCreationEvent " +
"WITHIN 1 " +
" WHERE TargetInstance ISA 'Win32_Process' " +
" AND TargetInstance.Name = '" + processName + "'";
// The dot in the scope means use the current machine
string scope = @"\\.\root\CIMV2";
// Create a watcher and listen for events
ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString);
watcher.EventArrived += ProcessStarted;
watcher.Start();
return watcher;
}
private ManagementEventWatcher ProcessEndWatcher(string processName)
{
string queryString =
"SELECT TargetInstance" +
" FROM __InstanceDeletionEvent " +
"WITHIN 1 " +
" WHERE TargetInstance ISA 'Win32_Process' " +
" AND TargetInstance.Name = '" + processName + "'";
// The dot in the scope means use the current machine
string scope = @"\\.\root\CIMV2";
// Create a watcher and listen for events
ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString);
watcher.EventArrived += ProcessEnded;
watcher.Start();
return watcher;
}
private void ProcessStarted(object sender, EventArrivedEventArgs e)
{
this.processStart = DateTime.Now;
}
private void ProcessEnded(object sender, EventArrivedEventArgs e)
{
// use time recorded from ProcessStarted to calculate run duration, write to log file
this.logger.addRuntimeData((DateTime.Now - this.processStart).TotalSeconds);
}
addRuntimeData(double seconds)
方法は次のように定義されます:
public void addRuntimeData(double seconds)
{
this.runDurations.Add(seconds);
if (this.runDurations.Count > Properties.Settings.Default.MaxRunDurationData)
this.runDurations.RemoveAt(0);
this.updateLog();
}
public void updateLog()
{
this.logfileDirectory = Properties.Settings.Default.LogfileDirectory;
this.logfileFullPath = logfileDirectory + this.task.Name.toValidFilename() + this.logfileExtension;
Directory.CreateDirectory(logfileDirectory); // create directory if it does not already exist
this.toXElement().Save(this.logfileFullPath); // generate the XML and write it to the log file
}
今、私は時間に私が書いたテストプロセスをしようとしていて、すべてのテストプロセスを行うことはConsole.WriteLine("Test process");
への単一の呼び出しであるので、記録継続のための適切な値はおおよその範囲0にする必要があります-2秒。
時々、私は適切な値を取得します。63619141321.2978秒のように、文字通り記録できなかった値を取得することがあります。これは、およそ2017.3年に相当します。これは、開始時刻が01/01/0001 00:00:01
またはそのようなものとして記録されていることと関連があると私に思います。この問題にこれと関連がある可能性はありますか?
これは私が(たとえば、OSがメッセージをどのように/どのようにトリガーするかと関係がある)問題であれば、これらを明らかに無効にする方法があるデータポイント?
[Bobby Tables](http://bobby-tables.com/)が表示される場合があります。 –
@MattRowland lol rekt savage –
おそらく、 'ProcessStarted'が起動する前に継続時間が記録され、' processStart'が初期化されるためです。 – dbc