我目前有一个程序可以拦截一些数据包,根据信息对列表进行一些修改/添加类并将其发送。
我目前正在做的是当我添加一个项目时,我在添加它的同时锁定了我正在添加的列表。但是,我有一个 PictureBox,它每 50 毫秒左右从列表中提取信息。目前我这样做的方式是这样的:
Graphics g = e.Graphics;
lock (Core.Collections.SpaceStations)
{
foreach (Classes.Station station in Core.Collections.SpaceStations)
{
Image img;
switch (station.Company)
{
case 1:
img = Prog.Properties.Resources.mmo_station;
break;
case 2:
img = Prog.Properties.Resources.eic_station;
break;
case 3:
img = Prog.Properties.Resources.vru_station;
break;
default:
img = new Bitmap(50, 50);
break;
}
g.DrawImage(img, (float)((station.Position.x - 750) / Core.CurrentMap.ByX), (float)((station.Position.y - 750) / Core.CurrentMap.ByY), 35, 35);
}
}
正如你所看到的,它锁定了整个迭代长度,这导致我的数据包处理程序阻塞,直到它完成绘制,并可能导致服务器和客户端延迟(因为我在添加或删除数据包处理程序中的项目之前锁定)。我的问题是将列表中的所有项目复制到锁内的临时列表中,然后从临时列表中将它们全部绘制到锁外会更快吗?主要是我的问题是,遍历列表或复制列表是否更快。