0

私はカスタムスケジューラを書いているので、スケジューラが次のタイムスロットを見逃すほど多くの時間を費やすことなく、現時点で実行するように登録されているタスクを起動したいと考えています。したがって、次のスケジュールされたイベントまでスリープし、その次のイベントまたはイベントを起動して実行し、再びスリープするスレッドを作成しました。タスクはバックグラウンドでプロセスとして実行されるため、タスクをセットアップしてできるだけ早く起動することができます。制御プロセスのロギングを容易にするために、ウェイクアップ時にプロセスを起動するときに消費するタスクの内部キューを保持しますが、そのタスクのロギングを終了できる EventHandler も必要です。それが終了したら、それが失敗したか成功したか。

Process.Process() クラスを使用してバックグラウンドでタスクを実行しているため、ログを正しく終了できるように、一意のタスク参照をハンドラーに渡す方法がありません (確認できます)。以下のコードのようにハンドラを設定しています。

pTask = new Process();
pTask.Exited += new EventHandler(pTask_Exited);

私の研究では、EventArgs でデータをピギーバックする必要がある場合、設計に欠陥があるという 1 つの回答を集めた同様の質問に出くわしたため、意図的にピギーバックという用語をタイトルに使用しました。私のデザインに欠陥があるかもしれないことは認めますが、どのように異なる方法でより効果的にデザインするべきかについての啓蒙を見つけることができませんでした. 任意のガイダンスをいただければ幸いです。

4

2 に答える 2

1

次のようにラムダを使用してこれを実現できます。

最初に、プロセスの終了時に実行されるメソッドを定義します。これは、現在使用しているイベント ハンドラーの代わりになり、必要なログなどを実行します。

void ExitHandler(Process process, YourTaskInfo taskInfo) // YourTaskInfo is some class that contains data about the task that needs to be passed to the handler
{
    Console.WriteLine("Process for task: {0} exited with code: {1}", taskInfo, process.ExitCode);
}

Exited次に、このメソッドを次のようにイベント ハンドラーにアタッチできます。

pTask.Exited += (s,e) => ExitHandler(pTask, taskInfo);

このようにして、送信者または EventArgs での「便乗」などを心配することなく、一意のタスク参照 ( taskInfo) をハンドラーに渡すことができます。Exited

于 2013-01-24T01:24:52.913 に答える
0

Processとして渡されるそれ自体からデータを取得しますsender

void pTask_Exited(object sender, EventArgs e)
{
    Process p = (Process)sender;
    TimeSpan duration = p.ExitTime - p.StartTime;
    bool success = p.ExitCode == 0;
}
于 2013-01-24T01:30:05.590 に答える