【发布时间】: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 秒。来显示数据。如果使用得当,一个简单的迭代可以做什么令人惊讶。基本上将此迭代移动到序列的开头。