我有一个程序,它通过点击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= 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使用的数据库。然后,UI每隔5分钟加载一次新数据库。
提前谢谢你!!
发布于 2017-12-27 18:36:35
如此多的响应可能是迭代与基于集合的编码风格的症状。如果涉及到Linq2SQL或EF,我会检查以确保使用了立即加载(或者强制使用.ToList()或.AsEnumerable()进行早期评估,同时避免使用.AsQueryable())。
https://stackoverflow.com/questions/47996530
复制