У меня есть 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
, чтобы гарантировать, что ничего не будет поставлено в очередь или удалено из очереди, пока этот метод не будет выполнен, но я не уверен, что это за что-то.