winforms 如何在多个数据表中使用列表项值C#?

bakd9h0s  于 2022-11-16  发布在  C#
关注(0)|答案(1)|浏览(182)

我正在尝试使用C# WinForms构建一个Windows交易应用程序。我已经成功地通过WebSocket将价格源连接到我的应用程序,并将每个符号的最后价格存储在Datatable(价格)中。
我还有另一个Datatable(订单),它存储所有未结订单,因此为了计算当前的利润/亏损,我必须使用数据集将价格和订单数据表链接起来,这样我就可以使用最后的价格来执行计算。
但是我注意到更新价格数据表非常慢,特别是在重大经济事件导致价格处理延迟时,所以我用列表替换了价格数据表。
现在价格处理速度快多了,延迟小得可以忽略。但我的问题是如何将我的价格列表链接到我的订单数据表,这样无论何时我的列表中的任何价格变化都会自动反映在我的订单数据表中?有没有一种方法可以将每个订单行的指针设置为指向特定的列表项目价格?
谢谢你

euoag5mw

euoag5mw1#

提高价格更新性能的一种方法是批量处理价格更新。实际上,您只存储每种商品的最新价格更新,然后在一个相当快的计时器上应用更新。更新的频率由您决定。
下面是简单的例子,但是有很多不同的方法可以批量应用价格更新。

public class PriceUpdater
{
    //The key can be anything unqiue, but here I'll just assume symbol works
    private readonly Dictionary<string, double> pricesBySymbol = 
        new Dictionary<string, double>();

    private readonly Timer timer;

    public PriceUpdater()
    {
        timer = new Timer(ApplyPrices);
        //This starts the timer now, and interval of 200 millis
        timer.Change(0, 200);
    }

    //Lets presume this is called for every last price tick
    //If this gets called by multiple threads add synchronization
    public void HandleLastPriceTick(string symbol, double price)
    {
        pricesBySymbol[symbol] = price;
    }

    public void ApplyPrices(object state)
    {
        //iterate over the dictionary and apply the prices everywhere else
        //that's performance critical
        foreach(var item in pricesBySymbol)
        {
            string symbol = item.Key;
            double price = item.Value;
            //Raise an event, or call a method here to apply the change
        }
        //Alternatively, do a bulk update however you want using the latest prices
    }
}

这样做仍然适用于所有的价格更新,它只是这样做的批量X经常。并使性能稳定,即使在时间的高频市场更新。

优点

可以处理极高的更新速度而不影响性能
相对容易实现线程安全
可以将此设计与另一个设计结合使用,其中要求立即接收所有更新

缺点

这仅获取最新价格,如果需要处理所有分笔成交点,则不适用
上述实现不会存储价格是否发生变化,或者每种商品是否有新的分笔成交点。您可能希望实现该实现以跳过应用过时的值。

相关问题