我需要处理来自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...
Run Code Online (Sandbox Code Playgroud)
我对事件299以及与299事件的相关id匹配的第一个事件500感兴趣.我在上面的流中标记了它们,这是我感兴趣的输出集合:[X1, X2, Y1, Y2, Z1, Z2]这可能是使用相关id作为键的字典和EventRecord作为值的元组
{ 1AD.., <X1, X2> }
{ 43B.., <Y1, Y2> }
{ EDB.., <Z1, Z2> }
Run Code Online (Sandbox Code Playgroud)
一般情况下,事件可能会按顺序排列(299然后是500),但在高并发情况下,我预见会有两个299个事件,然后是500个事件,所以我不想依赖事件发生的顺序.相关id是关联它们的关键(这是事件的第一个属性eventRecord.Properties[0])
我认为这可以通过状态机来解决,但是看看是否有人想出一个Rx的解决方案,这个解决方案由一个可观察的查询表示,这将是很有趣的.这将使模式匹配逻辑保持在一个位置.
更新:这是解决方案的答案.谢谢基甸,这正是我需要的起点!
var pairs = events
.Where(e299 …Run Code Online (Sandbox Code Playgroud)