Tôi cần xử lý các sự kiện đến từ EventLog. Điều này rất dễ dàng bằng cách sử dụng EventLogWatcher gắn với sự kiện EventRecordWritten. Tuy nhiên truy vấn mà tôi quan tâm (eventid == 299 || eventid == 500) cung cấp nhiều sự kiện hơn những gì tôi cần. Dưới đây là ví dụ về luồngXử lý sự kiện từ Nhật ký Sự kiện và phản ứng trên một mẫu nhất định (Rx?)
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...
Tôi quan tâm đến sự kiện 299 và sự kiện 500 đầu tiên khớp với id tương quan của sự kiện 299. Tôi đánh dấu chúng trong dòng ở trên, đó là bộ sưu tập đầu ra Tôi quan tâm đến: [X1, X2, Y1, Y2, Z1, Z2]
mà có lẽ là một từ điển bằng cách sử dụng id tương quan như một chìa khóa và một tuple của EventRecord
như giá trị
{ 1AD.., <X1, X2> }
{ 43B.., <Y1, Y2> }
{ EDB.., <Z1, Z2> }
Trong sự kiện chung có thể đến theo thứ tự (299 và sau đó 500) nhưng trong một tình huống tương tranh cao, tôi thấy trước hai sự kiện kết hợp với nhau và sau đó là 500 sự kiện nên tôi không muốn dựa vào thứ tự các sự kiện đến. Các tương quan id là chìa khóa để tương quan chúng (đó là tài sản đầu tiên của sự kiện eventRecord.Properties[0]
)
Tôi nghĩ rằng điều này có thể được giải quyết với một máy nhà nước nhưng nó sẽ là thú vị để xem nếu có ai đến với một giải pháp với Rx đại diện bởi một truy vấn đến một quan sát được. Điều đó sẽ giữ cho mô hình phù hợp với logic ở một nơi duy nhất.
CẬP NHẬT: đây là câu trả lời cho giải pháp. Cảm ơn Gideon, đó chính là điểm khởi đầu tôi cần!
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 });
Cảm ơn trước, Matias
phát ngay! Cảm ơn Gideon ... truy vấn sử dụng lambda và lấy (1) được đưa vào câu trả lời của tôi – woloski