我有一个程序,通过使用DataGridView点击一个项目来请求用户输入数据,并在给定Stock符号的情况下自动请求新信息。当从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]");
}
然后对于更新序列,它使用相同的代码,但符号[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次,它将开始花费15-30秒,以便UI数据显示在UI上。这是一旦worker完成了从存储列表中删除的requestID的工作。
每次触发更新序列时,它都会在15秒内收到8,000个响应。
我的问题是,有更好的方法吗?我可以使用后台线程在计时器上运行仅更新序列的重复修改版本。
任何的意见都将会有帮助!!我已经尝试了4种不同的方式,只存储UI请求,然后如果不在列表中自动更新方法。
所有Update方法都是更新UI使用的数据库。然后每5分钟一次,UI加载新数据库。
先感谢您!!
许多响应可能是迭代与基于集合的编码样式的症状。如果涉及到Linq2SQL或EF,我会检查以确保正在使用急切加载(或强制使用.ToList()或.AsEnumerable()进行早期评估,同时避免使用.AsQueryable())。