Working with Pop3Client Asynchronously

Working with messages can be performed asynchronously as well by using the Aspose.Email’s Pop3Client. This article shows how to retrieve messages from a mailbox asynchronously. It also shows how to list messages by providing search criteria using¬†MailQuery. It will be shown separately how to interrupt an operation with a mailbox started by a task-based asynchronous pattern (TAP) method.

Retrieve Messages Asynchronously

The following code snippet shows you how to retrieve messages asynchronously.

List Messages Asynchronously with MailQuery

The MailQuery class can be used to specify search criteria for retrieving a list of messages asynchronously as is shown in the following code sample.

How to Interrupt a TAP Method

Starting with .NET Framework 4.5, you can use asynchronous methods implemented according to TAP model. The code snippet below shows how to receive information about a mailbox using the task-based asynchronous pattern method named GetMailboxInfoAsync and then interrupt this process after a while.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET

using (Pop3Client client = new Pop3Client(host, 995, senderEmail, password, SecurityOptions.Auto))
{
    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    AutoResetEvent autoResetEvent = new AutoResetEvent(false);
    Exception exception = null;

    ThreadPool.QueueUserWorkItem(delegate
    {
        try
        {
            // start receiving mailbox information
            var task = client.GetMailboxInfoAsync(cancellationTokenSource.Token);
            Pop3MailboxInfo mailboxInfo = task.GetAwaiter().GetResult();
            Console.WriteLine("Message count: " + mailboxInfo.MessageCount);
        }
        catch (Exception e)
        {
            exception = e;
        }
        finally
        {
            autoResetEvent.Set();
        }
    });

    Thread.Sleep(2000);

    // stop receiving mailbox information
    cancellationTokenSource.Cancel();
    autoResetEvent.WaitOne();

    if (exception is OperationCanceledException)
        Console.WriteLine("Operation has been interrupted: " + exception.Message);
}