0

イベントで発生するレコードを収集する 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のチェックを追加しました。

4

2 に答える 2

0

ConcurrentQueue を使用します。

private void EventAggregator_JournalRecordPosted(object sender, JournalRecordEventArgs e)
{
    records.Enqueue(e.Record);

    if (records.Count >= settings.TradeJournalLength)
    {
        recordType temp = null;
        records.TryDequeue(out temp);
    }
}
于 2013-10-18T17:34:36.437 に答える