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
それが何であるかはわかりません。