0

ConcurrentQueueキューにエンキューおよびキューからデキューするためのいくつかのヘルパー メソッドを持つオブジェクトを保持する があります。いくつかの基準に一致するアイテムをキューから削除してからキューを再構築する必要があります。これは、デキューされた最初のアイテムに含まれていない可能性があるためです。

どうすればこれを安全に行うことができますか?

ConcurrentQueueスレッドセーフであるはずですが、削除と再構築が行われているときにアイテムがキューに追加/削除されないようにしたいです。

私はこれを試していますが、それが正しいかどうかはわかりません。

public class EmailRepository
{
    private readonly object _lockObj _lockObj = new object();
    private ConcurrentQueue<EmailMessage> _emailMessages = new ConcurrentQueue<EmailMessage>();

    public ConcurrentQueue<EmailMessage> EmailMessages => _emailMessages;

    public void AddEmailMessage(string subject, string body)
    {
        _emailMessages.Enqueue(new EmailMessage(subject, body));
    }

    public void AddEmailMessage(EmailMessage message)
    {
        _emailMessages.Enqueue(message);
    }

    public bool RemoveEmailMessage(out EmailMessage message)
    {
        return _emailMessages.TryDequeue(out message);
    }

    public void RemoveSiteEmailsAndRebuildQueue(int key)
    {
        for (int i = 0; i < _emailMessages.Count; i++)
        {
            RemoveEmailMessage(out EmailMessage message);
            if (message.KeyValue.Equals(key))
            {
                continue;
            }

            AddEmailMessage(message);
        }
    }
}

私は公開し_emailMessagesていますが、適切なメソッドを呼び出さない限り、実際にはコレクションを変更していません。

そのメソッドの実行が完了するまで何もエンキューまたはデキューしないようにするために、ロジックの周りに何かを配置する必要があると思いますが、RemoveSiteEmailsAndRebuildQueueそれが何であるかはわかりません。

4

1 に答える 1