gpt4 book ai didi

c# - 确保线程安全

转载 作者:太空狗 更新时间:2023-10-29 21:59:41 25 4
gpt4 key购买 nike

我正在编写一个 C# Windows 窗体应用程序,该应用程序通过算法(策略)处理来自市场的报价,以便为经纪公司创建订单。在我尝试构建在其自己的线程上同时运行多个策略的能力之前,这一切似乎都经过了很好的测试。在这一点上,一切都开始不正确地运行。我相信我有一些不是线程安全的类,它们会导致不稳定的行为。非常感谢任何关于如何以线程安全的方式对其进行线程化的见解!

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

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

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

传入的报价对象被传递到 StrategyAssembler 类的 NewIncomingQuote 方法中。该代码如下:

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

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

priorQuote = QUOTE;
}
}

我在想,通过在将报价传递给 manager.LiveQuote(Quote quote) 方法之前使用锁,所有使用该点“下游”报价的对象都能够在线程安全中使用报价时尚,但测试显示并非如此。有没有一种方法可以将 StrategyAssembler 的每个实例放在它自己的线程上,以确保 StrategyAssembler 创建的所有对象都是线程安全的,然后将引用提供给 StrategyAssembler?这种思路是否适合处理这种情况?

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

学习1

最佳答案

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

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

关于c# - 确保线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2358533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com