Есть приложение в котором происходит обработка транспортных пакетов и парсинг их на таблицы MPEG TS. Сейчас это реализовано так:
private readonly Lazy<NIT_Factory> m_lazyNitFactory = new Lazy<NIT_Factory>();
private readonly Lazy<EIT_Factory> m_lazyEitFactory = new Lazy<EIT_Factory>();
private readonly Lazy<SDT_BAT_Factory> m_lazySdtBatFactory = new Lazy<SDT_BAT_Factory>();
private EIT_Factory CurrentEitFactory => m_lazyEitFactory.Value;
private SDT_BAT_Factory CurrentSdtFactory => m_lazySdtBatFactory.Value;
private NIT_Factory CurrentNitFactory => m_lazyNitFactory.Value;
Далее процесс разделения на пакетов на таблицы:
foreach (var tspacket in tsPackets)
{
...
else if (tspacket.Pid == (short)ReservedPids.NIT)
{
CurrentNitFactory.PushTable(tspacket);
}
else if(tspacket.Pid == (short)ReservedPids.SDT)
{
CurrentSdtFactory.PushTable(tspacket);
}
else if(tspacket.Pid == (short)ReservedPids.EIT)
{
CurrentEitFactory.PushTable(tspacket);
}
...
}
Перечисленные выше три таблицы, наиболее "жирные" и их сборка и парсинг наиболее ресурсоёмкие. Но эти таблицы не зависят от других и изначально имеют фиксированный пид. Поэтому их можно обрабатывать каждый в отдельном потоке. Но каждый поток должен работать только с одним экземпляром класса фабрики. Очерёдность прихода пакетов в фабрику должна сохранятся в том виде в каком они пришли в этот метод. При этом желательно не менять сами фабрики. Как это лучше сделать?
Lazy<T>. https://stackoverflow.com/q/15222580/12888024 – aepot Aug 31 '21 at 11:48