所有 我需要尽快进行大量的实时数据。
这些数据来自多个网络连接线程。
所有网络线程都将数据传递给共享函数,以便对恢复的数据进行一些转换和解释,然后将信息按对象保存到并发字典中。
问题是我在这本字典中存储的数量可能达到150K。
当获取对象进行更新时,会发生什么事情需要花费很长时间而不是接受时间。
public class MyObject
{
System.Timers.Timer LostTimer = new System.Timers.Timer();
public int ID;
public DateTime UpdateTime;
public MyObject()
{
LostTimer.Interval = 20000;
LostTimer.Elapsed+=TimerElapsedHandler(LostTimer_Elapsed);
LostTimer.Enabled = true;
}
void LostTimer_Elapsed(object sender,EventArgs e)
{
if(UpdateTime > DateTime.Now.AddSeconds(-20))
Console.WriteLine(ID + " Lost...");
}
}
public class MyClass
{
public MyClass(){}
private ConcurrentDictionary<int,MyObject> Objects = new ConcurrentDictionary<int,MyObject>();
void NetworkThread1DataRecived(eventArgs e)
{
Translate(e.Data);
}
void Translate(string[] data)
{
Task.Factory.StartNew(()=>
{
Parallel.ForEach(data, s (()=>
{
MyObject o = null;
Objects.TryGet(int.Parse(s),out o)
if(o == null)
{
o = new MyObject();
o.ID = int.Parse(s);
o.UpdateTime = DateTime.Now;
Objects.TryAdd(s,o);
}
else
{
o.UpdateTime = DateTime.Now;
}
});
});
}
}
现在,当处理超过30K的物体时,它会让我丢失物体。请我急需帮助
逻辑是我从当前系统时间中减去对象宽限期,并将其与该对象的上次更新时间进行比较。 你认为这种类型的线程安全数组(字典)无法处理这么大量的数据并导致read./write访问延迟导致对象丢失??? 在我使用List和Lock(Object){}来处理对这个共享内存的多线程访问之前,但它在10K对象之后失败了。 将其更改为字典(.Net构建在线程安全列表中)后,它可以很好地处理30K。 我的目标是达到150K,我能用这个逻辑达到它还是你有更好的想法。
答案 0 :(得分:3)
因此,对于您添加的每个对象(30K对象),您将创建一个计时器。这是活跃的30.000计时器。
我认为这会产生很多开销。
如果这仅用于记录/审核,则应在1个计时器中执行此操作。可能会创建一个您想要记录的对象的单独列表/字典。