c# - 使用 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);
注意:没有实现从队列中读取/取出信号仅写入。
解决方案
推荐阅读
- android - 如何检查应用程序是通过 NFC Tag 快捷方式启动还是手动启动应用程序
- java - 检查 Java 对象是否为 Collection、Array 或 String 并且为空
- c# - 将响应与异常一起包装的正确方法
- javascript - 改变时间格式
- kubernetes - 在已安装的版本上运行 helm 测试套件引入延迟
- scripting - 这个脚本怎么知道'currentPlayer'是谁?
- prolog - Prolog 中的实体关系数据模型
- javascript - 使用 D3.js 在生产 React.js 中运行构建项目与项目时的不同结果
- php - 如何遍历json数据并发送到数据库中?
- python - python循环在行中插入值