Переменные Stati c не разделяются между потоками при использовании контейнеров Unity - PullRequest
2 голосов
/ 11 февраля 2020

У меня есть следующий класс

public static class EventHandlers
{
   public static readonly BlockingCollection<SignalCommands.Commands> CommandsQueue = new BlockingCollection<SignalCommands.Commands>();
}

, где в экземпляр класса A добавляются предметы, а в классе B - предметы

Класс A EventHandlers.CommandsQueue.Add(SignalCommands.Commands.CMD_CMN_START)

Класс B EventHandlers.CommandsQueue.Take()

Когда я запускаю код без контейнеров Unity, он работает как положено, то есть у меня есть производитель с одной стороны и потребитель с другой. Когда я переключаюсь на экосистему Unity, используя DI, он показывает, что для каждого потока создается новая Instace, поэтому экземпляр класса B никогда не получает значения, добавленные из calss A. Может ли кто-нибудь объяснить поведение и представить решение?

PS # 1 Я не хочу внедрять экземпляр BlockingCollection в класс B, я просто хочу поделиться объектом stati c между несколькими потоками.

Обновление:

public static class DependencyManager
{
    private static readonly Lazy<IUnityContainer> _implementation = new Lazy<IUnityContainer>(() => Initialize(), System.Threading.LazyThreadSafetyMode.PublicationOnly);

    public static IUnityContainer Current
    {
        get
        {
            return _implementation.Value;
        }
    }

    private static IUnityContainer Initialize()
    {
        Console.WriteLine("Initialize IoC");
        try
        {
            IUnityContainer container = new UnityContainer().AddExtension(new Diagnostic());
            container.RegisterType<CommandHandler>(TypeLifetime.ContainerControlled, new InjectionConstructor(new ResolvedParameter<IPropertiesManager>()));

            container.RegisterSingleton<TradesSynchronizer>(new InjectionConstructor(new ResolvedParameter<IPropertiesManager>(), new ResolvedParameter<IConnectionService>(ConnectionType.DIRECT), new ResolvedParameter<ITradeService>(), new ResolvedParameter<JournalService>()));

            container.RegisterType<ITradeService, TradeService>(TypeLifetime.ContainerControlled, new InjectionConstructor(new ResolvedParameter<IPropertiesManager>(), new ResolvedParameter<IBootStrapper>(ConnectionType.PUMPING), new ResolvedParameter<ITickService>()));

            return container;
        }
        catch (Exception ex)
        {

            Console.WriteLine(ex.StackTrace);
        }
        return null;
    }
}

Сейчас в Входной класс (приложение) У меня есть следующий

Класс, который производит сигналы Task.Run(() => DependencyManager.Current.Resolve<CommandHandler>().Start());

Тот, кто получает сигналы Task.Delay(TimeSpan.FromSeconds(1)).ContinueWith(t => DependencyManager.Current.Resolve<TradesSynchronizer>().Start()).ContinueWith(_task => Utils.LogException(_task, _logger));

Вот мои журналы:

Формат журнала: Дата | Уровень | ThreadId | Class | Message

2020/02/13 16:09:32.603|DEBUG|4|CommandHandler|Adding signal to queue ..
2020/02/13 16:09:32.603|DEBUG|4|CommandHandler|Adding signal to queue ..
2020/02/13 16:09:33.882|DEBUG|10|TradesSynchronizer|Total signals count 2
2020/02/13 16:09:33.883|DEBUG|10|TradeService|Summary Total signals count 0`

TradeService внедряется в TradesSynchronizer, однако, как вы можете видеть, оба работают в одном потоке 4.

Один и тот же вызов для обоих классов - _logger.Debug ( «Общее количество сигналов» + EventHandlers.CommandsQueue.Count);

Примечание. Не существует реализации для чтения / извлечения сигналов из очереди, только запись в.

...