1

Есть приложение в котором происходит обработка транспортных пакетов и парсинг их на таблицы 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 =&gt; m_lazyEitFactory.Value;
private SDT_BAT_Factory CurrentSdtFactory =&gt; m_lazySdtBatFactory.Value;        
private NIT_Factory CurrentNitFactory =&gt; 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);                     
            }
            ...
    }

Перечисленные выше три таблицы, наиболее "жирные" и их сборка и парсинг наиболее ресурсоёмкие. Но эти таблицы не зависят от других и изначально имеют фиксированный пид. Поэтому их можно обрабатывать каждый в отдельном потоке. Но каждый поток должен работать только с одним экземпляром класса фабрики. Очерёдность прихода пакетов в фабрику должна сохранятся в том виде в каком они пришли в этот метод. При этом желательно не менять сами фабрики. Как это лучше сделать?

Deim
  • 662
  • Вопрос слишком специфический. В идеале его можно обобщить, хотя-бы даже до арифметической операции, взять коллекцию примитивных данных и написать воспроизводимый запускаемый пример. И вот к нему уже приложить ваш вопрос из конца поста. Вас же интересует методика работы с многопоточностью, а не как пережевывать видео-потоки, верно? – aepot Aug 31 '21 at 11:23
  • @aepot +- верно. По сути как многопоточная фабрика, в которой сами фабрики синглтоны. – Deim Aug 31 '21 at 11:40
  • 1
    Начните с того, что в условиях многопоточности ваши свойства не являются потокобезопасными. Скажем так, если в самом начале работы кода 2 потока одновременно запросят одно и то же свойство (когда поле null), то есть ненулевая вероятность, что они получат разные экземпляры класса. Вероятно лучше использовать инициализацию полей например конструкторе, то есть принудительную, а не ленивую, или еще есть Lazy<T>. https://stackoverflow.com/q/15222580/12888024 – aepot Aug 31 '21 at 11:48
  • @aepot обобщил вопрос https://ru.stackoverflow.com/questions/1323104/%d0%9c%d0%bd%d0%be%d0%b3%d0%be%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%b0%d1%8f-%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b0-%d0%bf%d0%be%d1%81%d0%bb%d0%b5%d0%b4%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d1%8b%d1%85-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85 – Deim Aug 31 '21 at 14:46
  • этот тогда можно удалить – aepot Aug 31 '21 at 14:47
  • Лучше оставить, чтобы было понятна взаимосвязь вопросов: не у всех же есть 10к репутации. – A K Aug 31 '21 at 16:06

0 Answers0