EventLog からのイベントを処理する必要があります。これは、EventRecordWritten イベントにアタッチするEventLogWatcherを使用すると簡単です。ただし、関心のあるクエリ (eventid == 299 || eventid == 500) は、必要以上のイベントを提供します。これがストリームの例です
Event ID Correlation ID
299 1AD... (this is actually a guid) X1
500 1AD... X2
500 1AD...
500 1AD...
299 43B... Y1
299 EDB... Z1
500 43B... Y2
500 EDB... Z2
500 43B...
500 43B...
イベント 299 と、299 イベントの相関 ID に一致する最初のイベント 500 に関心があります。上記のストリームでそれらをマークしました。これは、私が興味を持っている出力コレクションです。[X1, X2, Y1, Y2, Z1, Z2]
これはおそらく、相関 ID をキーとして、のタプルをEventRecord
値として使用する辞書です。
{ 1AD.., <X1, X2> }
{ 43B.., <Y1, Y2> }
{ EDB.., <Z1, Z2> }
通常、イベントは順番に (299 の次に 500 のように) 発生しますが、同時実行性の高い状況では、2 つの 299 のイベントが一緒になってから 500 のイベントが発生することが予想されるため、イベントの発生順序に依存したくありません。相関 ID は、それらを相関させるためのキーです (イベントの最初のプロパティですeventRecord.Properties[0]
) 。
これはステート マシンで解決できると思いますが、Observable へのクエリによって表される Rx を使用した解決策を誰かが思いついたら興味深いでしょう。これにより、パターン マッチング ロジックが 1 か所に保持されます。
更新:これが解決策への答えです。ギデオンに感謝します。まさに私が必要としていた出発点でした!
var pairs = events
.Where(e299 => e299.EventArgs.EventRecord.Id == 299)
.SelectMany(e299 => events.Where(e500 => e500.EventArgs.EventRecord.Id == 500 &&
e299.EventArgs.EventRecord.Properties[0].Value.ToString() ==
e500.EventArgs.EventRecord.Properties[0].Value.ToString())
.Take(1),
(e299, e500) => new { First = e299, Second = e500 });
前もってありがとう、マティアス