добавление в список


#1

Отслеживаю процессы и сохраняю данные о ней в json. Сейчас проблема в том что если открыть программу №1, потом открыть №2 и закрыть эти программы то сохранится программа №2(последняя запущенная). Как сделать так что бы две программы сохранились?

using System;
using System.Management;

namespace ProjectX_V._2
{
class Program
{
public static SaveInfo saveInfo = new SaveInfo();
public static ProgrammInfo info = new ProgrammInfo();
public static string[] arrayProgramm = { "Calculator.exe", "Illustrator.exe", "Photoshop.exe", "notepad.exe", "HxCalendarAppImm.exe", "mspaint.exe","Telegram.exe" };
public static string id, nameStarted;

    public static void Main(string[] args)
    { 
        ManagementEventWatcher startProgramm = new ManagementEventWatcher(
            new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));
        startProgramm.EventArrived += StartProcesses;
        startProgramm.Start();
        ManagementEventWatcher stopProgramm = new ManagementEventWatcher(
            new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace"));
        stopProgramm.EventArrived += StopProcesses;
        stopProgramm.Start();
        Console.WriteLine("          Press ENTER to exit and save");
        Console.ReadLine();
        saveInfo.StopAndSave();
        startProgramm.Stop();
        stopProgramm.Stop();
    }

    static void StartProcesses(object programm, EventArrivedEventArgs e)
    {
        string name = e.NewEvent.Properties["ProcessName"].Value.ToString();
        if (Array.Exists(arrayProgramm, element => element == name) && name != nameStarted)
        {
            id = e.NewEvent.Properties["ProcessId"].Value.ToString();
            DateTime time = DateTime.Now;
            Console.WriteLine("start");
            saveInfo.Start();
            nameStarted = e.NewEvent.Properties["ProcessName"].Value.ToString();
        }
    }

    static void StopProcesses(object programm, EventArrivedEventArgs e)
    {
        if (e.NewEvent.Properties["ProcessId"].Value.ToString().Equals(id))
        {
            nameStarted = "";
            Console.WriteLine("stop");
            saveInfo.Stop(e);
        }
    }
}

}

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Management;

namespace ProjectX_V._2
{
class SaveInfo
{
Stopwatch stopwatch = new Stopwatch();
public static List list = new List();
public static string timeStart;

    public void Start()
    {
        stopwatch.Start();
        DateTime time = DateTime.Now;
        timeStart = time.ToLongTimeString();
    }

    public void Stop(EventArrivedEventArgs e)
    {
        DateTime time = DateTime.Now;
        stopwatch.Stop();
        TimeSpan ts = stopwatch.Elapsed;
        stopwatch.Reset();
        list.Add(new ProgrammInfo()
        {
            Id = e.NewEvent.Properties["ProcessId"].Value.ToString(),
            NameStart = e.NewEvent.Properties["ProcessName"].Value.ToString(),
            TimeStart = timeStart,
            TimeStop = time.ToLongTimeString(),
            LongTime = ts.ToString()
        });
        Console.WriteLine($"{e.NewEvent.Properties["ProcessName"].Value.ToString()} - data is saved");
    }

    public async void StopAndSave()
    {
        Serialization finish = new Serialization();
        await finish.SerializeAsync(list);
    }
}

}


#2

краткое описание

  1. Я подписался на события, когда запускается процесс с нужным именем сохраняю в переменную id (для слежения остановки) и nameStart = имя программы (для того что бы не реагировать на другие процессы программы).
  2. class SaveInfo - Start(): записываем имя и вкл. секундомер.
  3. class Program - StopProcesses(): ждем завершение процесса с нужным id -> nameStart = null.
  4. class SaveInfo - Stop() добавляем всё в List<>.
  5. По выходу из написанной программы выполняем сериализацию листа.
    Вопрос: при запуске калькулятора затем фотошопа и закрытии этих программ не важно в каком порядке, сохранится последняя(фотошоп, так как он пришел и перезаписал все), не могу допереть как сделать так что бы сохранялись данные о всех программах.

P.S. программа будет следить за 5-10 программами