我的数据上贴有来自客户端的时间戳,并通过网络套接字传递给我的服务器。
有时订单会出错,这意味着时间戳的顺序错误。 所以,我创建了一个SortedDictionary集合对象:
public SortedDictionary<Int64, string> Manifest = new SortedDictionary<Int64, string>();
这些数据变得越来越快(尽可能快),并且实时每秒多达10个数据“块”。
但是,有时候下一个数据“阻止”可能需要10秒才能完成。
另一个应该接收此数据流正确顺序的客户端也需要是实时的。
但是,就我所见,这个实时需求是无法完成的,所以我考虑创建一个10秒钟的数据缓存。
现在,您会认为这很容易,但我遇到了错误,例如:
'entry already added'
'cannot find key'
这些错误似乎源于您无法在阅读时修改此类集合的事实。
到目前为止我的代码是这样的:
在我的网络套接字中的接收事件中,我有这个:
Manifest.Add(timestamp, 'data');
然后,说我的计时器(每100毫秒运行一次):
var pts = Manifest.ElementAt(0);
var key = res.TS;
//my 10 second cache
if (Convert.ToInt64(DateTime.Now.ToString("yyyyMMddHHmmssfff")) - key >= 10000)
{
//send the data
SendDataToClients(key .data);
//remove send data from queue
Manifest.Remove(res);
}
现在,我相信人们会说问题是我在阅读它的同时添加到此集合中,解决此问题的方法是使用锁定。
但我厌恶使用锁,因为它可以产生开销,因为我实时处理(尽管有第二次延迟)我承担不起任何开销。
他们有其他方法吗?我整天都在努力,并尝试了很多东西。
以上是我最好的方法。