public Task <IEnumerable <UnicastCommentMessage> > GetUnicastCommentMessages(Signature signature, AgreementPrivateKey agreementPrivateKey, int messageCountUpperLimit, IEnumerable <MessageCondition> conditions) { if (signature == null) { throw new ArgumentNullException(nameof(signature)); } if (agreementPrivateKey == null) { throw new ArgumentNullException(nameof(agreementPrivateKey)); } return(Task.Run(() => { try { var filter = new Dictionary <Signature, HashSet <DateTime> >(); { foreach (var item in conditions) { filter.GetOrAdd(item.AuthorSignature, (_) => new HashSet <DateTime>()).Add(item.CreationTime); } } var trustedMetadatas = new List <UnicastClue>(); { foreach (var UnicastClue in _coreManager.GetUnicastClues(signature, "MailMessage")) { if (!_searchSignatures.Contains(UnicastClue.Certificate.GetSignature())) { continue; } trustedMetadatas.Add(UnicastClue); } trustedMetadatas.Sort((x, y) => y.CreationTime.CompareTo(x.CreationTime)); } var results = new List <UnicastCommentMessage>(); foreach (var UnicastClue in trustedMetadatas.Take(messageCountUpperLimit)) { if (filter.TryGetValue(UnicastClue.Certificate.GetSignature(), out var hashSet) && hashSet.Contains(UnicastClue.CreationTime)) { continue; } var stream = _coreManager.VolatileGetStream(UnicastClue.Metadata, 1024 * 1024 * 1); if (stream == null) { continue; } var result = new UnicastCommentMessage( UnicastClue.Signature, UnicastClue.Certificate.GetSignature(), UnicastClue.CreationTime, ContentConverter.FromCryptoStream <CommentContent>(stream, agreementPrivateKey, 0)); if (result.Value == null) { continue; } results.Add(result); } return (IEnumerable <UnicastCommentMessage>)results.ToArray(); } catch (Exception e) { Log.Error(e); } return Array.Empty <UnicastCommentMessage>(); })); }