イベントで発生するレコードを収集する JournalService クラスがあります。このクラスは、レコードをリストに収集します。イベントは複数のスレッドから発生します。レコード リストの長さには制限があります。.NET 4.0 を使用しています。スレッドセーフにするために、「レコード」リストへの読み取りと書き込みアクセスをロックしています。私はその問題について経験がなく、うまくやっているとは思えません。おそらくSystem.Collections.Concurrent Namespaceを使用する必要があります
私の質問は次のとおりです。コードを修復する必要がありますか?また、使用する同時実行クラスとその方法は?
現在のコードは次のとおりです。
public class JournalService : IJournalService
{
private readonly List<JournalRecord> records = new List<JournalRecord>();
private readonly ISettings settings;
public JournalService(IEventAggregator eventAggregator, ISettings settings)
{
if (eventAggregator == null) throw new ArgumentNullException("eventAggregator");
if (settings == null) throw new ArgumentNullException("settings");
this.settings = settings;
eventAggregator.JournalRecordPosted += EventAggregator_JournalRecordPosted;
}
public IEnumerable<JournalRecord> GetRecords()
{
JournalRecord[] tempRecords;
lock (records)
{
tempRecords = records.ToArray();
}
return tempRecords;
}
private void EventAggregator_JournalRecordPosted(object sender, JournalRecordEventArgs e)
{
lock (records)
{
int surplus = records.Count - settings.TradeJournalLength;
if (surplus == 0)
records.RemoveAt(0);
else if (surplus > 0)
records.RemoveRange(0, surplus);
records.Add(e.Record);
}
}
}
EDIT : ロック内に置かれた余剰計算。 編集:余剰 == 0のチェックを追加しました。