我正在将Web套接字元素添加到持续增长的List中。我在一分钟内从网络套接字获得了大约70,000个滴答声。现在,我需要使用该列表中的值。但是当我要访问该列表时,它给了我这个错误:
目标数组不够长。检查destIndex和length,以及数组的下界。
我在Google上检查了有关此错误的信息,几乎所有建议都提到了锁。因此,我在那儿使用了锁,但仍然收到该错误。 因此,如何从不断增长的列表中访问数据。我不想打扰正在Web套接字端运行的列表过程。
websocket方面,我只声明了一个列表,如:
public static List<LiveMarketDataObject> liveQuotesList = new List<LiveMarketDataObject>();
...websocket connection and receive message code is here...
liveQuotesList.Add(_liveQuotes);
因此,这里每分钟向liveQuoteList添加70,000条记录。
另一方面,我正在尝试使用linq访问该列表中的值。但是这时它显示了一个错误。
readonly object _lock = new object();
private static List<LiveMarketDataObject> liveQuotesList = socketWithEvaluation.liveQuotesList;
...
...
lock (liveQuotesList)
{
var newQuoteList = liveQuotesList.ToList().Where(x => x.sym == symbolName && x.t >= startunixTime && x.t <= endunixTime).ToList();
}
当我尝试复制或尝试直接从该列表访问数据时,不允许我访问。那么如何从列表访问数据?
答案 0 :(得分:2)
要使代码具有线程安全性,应使用相同的锁针对列表同步所有操作,包括对Add
方法的调用:
lock (_lock)
liveQuotesList.Add(_liveQuotes);
...
lock (_lock)
{
var newQuoteList = liveQuotesList.Where(x => x.sym == symbolName && x.t >= startunixTime && x.t <= endunixTime).ToList();
}