ComponentPro UltimateMail

      Searching messages Asynchronously

      Language Filter: AllSend comments on this topic to ComponentPro

      Use ListMessagesAsync methods to asynchronously search messages with a set of criteria. These methods asynchronously search for messages with execution occurring on a new thread, therefore they allow your next line of code to execute immediately.

      In Task-based Asynchronous programs, the single asynchronous method represents the initiation and completion of an asynchronous operation. You may create the continuation code either explicitly, through methods on the Task class (for example, ContinueWith) or implicitly, by using language support built on top of continuations (for example, await in C#, Await in Visual Basic).

      In .NET 4.5 it is recommended to implement the Task-based Asynchronous Pattern.

      In Event-based Asynchronous programs, the event ListMessagesCompleted is raised when the ListMessagesAsync completes. In the event handler method of the ListMessagesCompleted, you can check if there were any errors by using the Error property of the event data object.

      The following example demonstrates how to asynchronously search messages with a set of criteria:

      Task-based approach

      using System;
      using ComponentPro.Net.Mail;
      
      ...
      
      // Create a new instance of the Imap class.
      Imap client = new Imap();
      
      // Connect to the server.
      client.Connect("myserver");
      
      // Or you can specify the IMAP port with 
      // client.Connect("myserver", 143); 
       
      // Login to the server.
      client.Authenticate("user", "password");
      
      // ... 
       
      // Select 'INBOX' mailbox.
      client.Select("INBOX");
      
      // Search for messages that have arrived since yesterday.
      ImapCriterion criteria = ImapCriterion.ArrivedBetween(DateTime.Now.AddDays(-1), DateTime.Now);
      
      // Search message that match the specified criteria. Only get message's unique Id and Size.
      ImapMessageCollection messages = await client.ListMessagesAsync(ImapEnvelopeParts.UniqueId | ImapEnvelopeParts.Size, criteria);
      
      // ... 
       
      foreach (ImapMessage m in messages)
      {
          Console.WriteLine(string.Format("UniqueId: {0}, Size: {1}", m.UniqueId, m.Size));
      }
      
      // Disconnect.
      client.Disconnect();
      

      Event-based approach

      using System;
      using System.ComponentModel;
      using ComponentPro;
      using ComponentPro.Net.Mail;
      
      ...
      
      public void DoSearchMessagesAsync()
      {
          // Create a new instance of the Imap class. 
          Imap client = new Imap();
      
          // Connect to the server. 
          client.Connect("myserver");
      
          // Or you can specify the IMAP port with 
          // client.Connect("myserver", 143); 
       
          // Login to the server. 
          client.Authenticate("user", "password");
      
          // ... 
       
          // Register an event handler. 
          client.ListMessagesCompleted += client_ListMessagesCompleted;
      
          // Select 'INBOX' mailbox. 
          client.Select("INBOX");
      
          // Search for messages that have arrived since yesterday. 
          ImapCriterion criteria = ImapCriterion.ArrivedBetween(DateTime.Now.AddDays(-1), DateTime.Now);
      
          // Search message that match the specified criteria. Only get message's unique Id and Size. 
          client.ListMessagesAsync(ImapEnvelopeParts.UniqueId | ImapEnvelopeParts.Size, criteria);
      
          // ... 
       
          // Disconnect. 
          client.Disconnect();
      }
      
      void client_ListMessagesCompleted(object sender, ExtendedAsyncCompletedEventArgs<ImapMessageCollection> e)
      {
          // Imap client = (Imap)sender; 
          if (e.Error != null)
              Console.WriteLine("Error: " + e.Error.ToString());
          else 
          {
              foreach (ImapMessage m in e.Result)
              {
                  Console.WriteLine(string.Format("UniqueId: {0}, Size: {1}", m.UniqueId, m.Size));
              }
          }
      }