私は現在、いくつかのパケットを傍受し、情報に基づいてリストにいくつかの変更/クラスを追加して送信するプログラムを持っています。
私が現在行っているのは、アイテムを追加するときに、追加しているリストをロックして追加することです。ただし、50ミリ秒ごとにリストから情報を取得するPictureBoxがあります。現在、私が行う方法は次のようになります。
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);
}
}
ご覧のとおり、反復の長さ全体にわたってロックされるため、ペイントが完了するまでパケットハンドラーがブロックされ、サーバーとクライアントの両方で遅延が発生する可能性があります(パケットハンドラーでアイテムを追加または削除する前にロックするため)。私の質問は、リストからすべてのアイテムをロック内の一時リストにコピーしてから、一時リストからロック外にすべてを描画する方が速いでしょうか?主に私の質問は、リストを反復処理する方が速いのか、それともリストをコピーする方が速いのかということです。