【问题标题】:C# Winforms .NET framework Data ProcessingC# Winforms .NET 框架数据处理
【发布时间】:2017-12-27 17:49:50
【问题描述】:

我有一个程序,它通过单击 DataGridView 中的项目来请求用户输入的数据,并在给定股票符号的情况下自动请求新信息。当从 api 服务器接收数据时,它会排队,后台工作人员会处理数据并通过文本框、图表和各种风险分析更新 UI。

我编写了一个更新序列,用于更新股票热度、利润率、当前价格。这就是我的问题所在。我无法更改服务器的内容,并且响应仅包含请求 ID。

我尝试将请求 ID 存储到列表中,然后在列表中搜索以确定它是用户输入还是更新序列。通过这样做,我可以在我的末端添加一个标签来告诉应用程序将数据发送到哪里进行处理。然而,这为整个过程增加了 3-5 秒。

当请求发送数据时,这里是正在使用的代码:

private void QuoteRequest_Click(object sender, EventArgs e)
{
    if (CheckSymbolValidity() == false)
            return;

        string[] symbols = new string[1];
        symbols[0] = this.textBoxSymbol.Text.ToUpper();

        short[] quoteFields = new short[4];
        quoteFields[0] = (short)ActiveTickFeedLib.ATQuoteFieldEnum.ATQuoteFieldLastPrice;

        int requestId = ActiveTickFeed.feed.SendQuoteDbRequest(symbols, quoteFields);

       Stored_ID(requestId+",[UI]");
}

那么对于更新序列,它使用相同的代码,除了 symbol[0]= sender.ToString();和 Stored_ID(requestID+",[UP]");从而更改应用程序的存储标签。

队列工作人员抓取响应数据并匹配请求 id 以获取标签。 然后从该标签中获取要使用的存储方法,例如:

string[] split = data.Split(new string[] {","}, stringsplitoptions.None);
if(split[1] == "[UI]")
{
     UI_Data(Res_Data); // method for using the data within the UI
}
//method for the update methods
if(split[1] == "[UP]")
{
    UP_Data(Res_Data);
}

所有这些都是为工人指明如何处理数据。更新序列触发 3 次后,UI 数据开始需要 15-30 秒才能显示在 UI 上。这是一旦工作人员完成了从存储列表中删除的 requestID 的工作。

每次触发更新序列时,它都会在 15 秒内收到 8,000 个响应。

我的问题是,有没有更好的方法来做到这一点?我可以使用后台线程在计时器上运行仅更新序列的重复修改版本吗?

任何建议都会有所帮助!!我尝试了 4 种不同的方式,从仅存储 UI 请求,然后如果不在列表中自动更新方法。

Update 方法所做的只是更新 UI 使用的数据库。然后每 5 分钟 UI 加载一次新数据库。

提前谢谢你!!

【问题讨论】:

  • 我能够通过仅存储 UI 的 Request_ID 来修复它 减少超过 300mB 的内存使用并加快 UI 速度。我使用了:if(Split[1] != Stored_ID.){//Update method queue} UI 现在是完全响应式的,耗时不到 2 秒。来显示数据。如果使用得当,一个简单的迭代可以做什么令人惊讶。基本上将此迭代移动到序列的开头。

标签: c# .net windows


【解决方案1】:

这么多响应可能是迭代与基于集合的编码风格的症状。如果涉及到 Linq2SQL 或 EF,我会检查以确保使用了急切加载(或使用 .ToList() 或 .AsEnumerable() 强制进行早期评估,同时避免使用 .AsQueryable())。

【讨论】:

  • 我在一个 xml 数据库中有 3750 个股票代码,它接收报价和柱历史数据以完全更新数据库的当前价格、开盘价、最高价、最低价、交易量。如果一个失败,它会收到 3 个响应,但是数据处理失败并添加到日志中。每只股票都由数据网格视图中的 foreach 单独调用。我已经检查过了。我运行更新序列 3 次并将所有响应存储到单独的网格视图并保存到 xml 以供手动分析。
  • 我要向队列工作人员添加另一个后台工作人员,看看它会做什么。现在有 5 名工人推动 60% 的 CPU 使用率。再添加一个应该会将我的 CPU 使用率提高到 70%,并且应该减少几秒钟。
  • 这就是我被发现添加错误日志方法的原因。非常好的建议!!谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多