首页 > 解决方案 > 使用 Unity 容器时,线程之间不共享静态变量

问题描述

我有以下课程

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

在类实例 A 上添加项目和在类 B 上获取项目

甲级 EventHandlers.CommandsQueue.Add(SignalCommands.Commands.CMD_CMN_START)

B类 EventHandlers.CommandsQueue.Take()

当我在没有 Unity 容器的情况下运行代码时,它会按预期工作,这意味着我一方面有生产者,另一方面有消费者。当我使用 DI 切换到 Unity 生态系统时,它会为每个线程创建一个新的 Instace,因此 B 类的实例永远不会从 calss A 中获得添加的值。有人可以解释这种行为并介绍解决方案吗?

PS #1 我不想将 BlockingCollection 实例注入 B 类,我只想在多个线程之间共享静态对象。

更新:

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 |类|消息

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("Total signals count " + EventHandlers.CommandsQueue.Count);

注意:没有实现从队列中读取/取出信号仅写入。

标签: c#.netmultithreadingunity-container

解决方案


推荐阅读