コード例 #1
0
        public void AddEvents(IEnumerable <AbstractEvent> abstactEvents)
        {
            var newEvents = new List <AbstractEvent>();

            foreach (var abstactEvent in abstactEvents)
            {
                switch (abstactEvent)
                {
                case LogEvent evt:
                {
                    if (evt.ProcessInvocationUID != null && !ProcessList.ContainsKey(evt.ProcessInvocationUID.Value))
                    {
                        continue;
                    }
                }
                break;

                case IoCommandStartEvent evt:
                {
                    if (!ProcessList.ContainsKey(evt.ProcessInvocationUid))
                    {
                        continue;
                    }
                }
                break;

                case ProcessInvocationStartEvent evt:
                {
                    if (!ProcessList.ContainsKey(evt.InvocationUID))
                    {
                        TrackedProcessInvocation invoker = null;
                        if (evt.CallerInvocationUID != null && !ProcessList.TryGetValue(evt.CallerInvocationUID.Value, out invoker))
                        {
                            continue;
                        }

                        var process = new TrackedProcessInvocation(evt.InvocationUID, evt.InstanceUID, evt.InvocationCounter, invoker, evt.Type, evt.Kind, evt.Name, evt.Topic);
                        ProcessList.Add(process.InvocationUid, process);
                        OnProcessInvoked?.Invoke(this, process);
                    }
                }
                break;

                case ProcessInvocationEndEvent evt:
                {
                    if (!ProcessList.TryGetValue(evt.InvocationUID, out var process))
                    {
                        continue;
                    }

                    process.ElapsedMillisecondsAfterFinished = TimeSpan.FromMilliseconds(evt.ElapsedMilliseconds);
                    if (evt.NetTimeMilliseconds != null)
                    {
                        process.NetTimeAfterFinished = TimeSpan.FromMilliseconds(evt.NetTimeMilliseconds.Value);
                    }
                }
                break;

                case RowCreatedEvent evt:
                {
                    if (!ProcessList.TryGetValue(evt.ProcessInvocationUid, out var process))
                    {
                        continue;
                    }

                    process.CreateRow();
                }
                break;

                case RowOwnerChangedEvent evt:
                {
                    if (!ProcessList.TryGetValue(evt.PreviousProcessInvocationUid, out var previousProcess))
                    {
                        continue;
                    }

                    TrackedProcessInvocation newProcess = null;
                    if (evt.NewProcessInvocationUid != null && !ProcessList.TryGetValue(evt.NewProcessInvocationUid.Value, out newProcess))
                    {
                        continue;
                    }

                    if (newProcess != null)
                    {
                        previousProcess.PassedRow(evt.RowUid);
                        newProcess.InputRow(evt.RowUid, previousProcess);
                    }
                    else
                    {
                        previousProcess.DropRow(evt.RowUid);
                    }
                }
                break;

                case RowValueChangedEvent evt:
                    continue;

                case SinkStartedEvent evt:
                {
                    var sink = new TrackedSink(evt.UID, evt.Location, evt.Path);
                    SinkList.Add(evt.UID, sink);
                    OnSinkStarted?.Invoke(this, sink);
                }
                break;

                case WriteToSinkEvent evt:
                {
                    if (!ProcessList.TryGetValue(evt.ProcessInvocationUID, out var process))
                    {
                        continue;
                    }

                    if (!SinkList.TryGetValue(evt.SinkUID, out var sink))
                    {
                        continue;
                    }

                    process.WriteRowToSink(evt.RowUid);
                    OnWriteToSink?.Invoke(this, sink, process, evt.RowUid, evt.Values);
                    sink.RowCount++;
                }
                break;
                }

                newEvents.Add(abstactEvent);
            }

            if (newEvents.Count == 0)
            {
                return;
            }

            OnEventsAdded?.Invoke(this, newEvents);
        }