尝试访问c#

时间:2019-04-09 14:30:19

标签: c# multithreading list linq

我正在将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();
}

当我尝试复制或尝试直接从该列表访问数据时,不允许我访问。那么如何从列表访问数据?

1 个答案:

答案 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();
}