确保螺纹安全

Lea*_*ng1 6 c# multithreading threadpool

我正在编写一个C#Windows窗体应用程序,该应用程序通过算法(策略)处理来自市场的报价,以向经纪公司创建订单.在我尝试构建与每个策略同时运行多个策略的能力之前,所有这些似乎都进行了相当好的测试.此时一切都开始运行不正确.我相信我有一些不是线程安全的类,它们会导致不稳定的行为.任何关于我如何以线程安全的方式来解决这个问题的见解深表赞赏!

将报价输入算法的方式如下:1)市场数据事件从Brokers Software发布到我的软件中称为ConnectionStatus的客户端类.当市场数据事件被触发时,Quote对象是根据这些静态变量的当前值构建的,这些变量代表Bid,ask等.一旦构建了报价,我就会努力将其发送到正在运行的每个策略算法中.这是我用来做的代码:

 foreach (StrategyAssembler assembler in StrategyAssembleList.GetStrategies())
 {                  
     BackgroundWorker thread = strategyThreadPool.GetFreeThread();
     if (thread != null)
     {
        thread.DoWork += new DoWorkEventHandler(assembler.NewIncomingQuote);
        thread.RunWorkerAsync(quote);
     }   
 }
Run Code Online (Sandbox Code Playgroud)

StrategyAssembler是一个创建Class StrategyManager实例的类,后者又创建包含实际算法的策略实例.可能有4或6个不同的StrategyAssembler实例,每个实例都已添加到StrategyAssembleList的Singleton实例中,该实例是BindingList.

传入的引用对象被传递到StrategyAssembler类的NewIncomingQuote方法.该代码如下:

public void NewIncomingQuote(object sender, DoWorkEventArgs e)
    {
        Quote QUOTE = e.Argument as Quote;            

        lock (QuoteLocker)
        {
            manager.LiveQuote(QUOTE);

            priorQuote = QUOTE;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想通过在将引用传递给manager.LiveQuote(引用引用)方法之前使用锁定,所有使用此点"下游"引用的对象都能够以线程安全的方式使用引用,但是测试显示不然.有没有办法可以将StrategyAssembler的每个实例放在自己的线程上,以确保Strategy Assembler创建的所有对象都是线程安全的,然后将引用提供给StrategyAssembler?这种思维方式是否适合应对这种情况?

在此先感谢您的任何反馈或帮助,

Learning1

spe*_*der 1

锁定应该发生在读取和写入任何共享状态时。如果没有读锁,代码仍然可以并发读写。

您可以将读写锁定包装到管理器中。