ComponentPro UltimateMail

      Downloading Message Headers Asynchronously

      Language Filter: AllSend comments on this topic to ComponentPro

      Use DownloadMessageHeadersAsync methods to asynchronously download headers of a message. These methods asynchronously download headers of a message 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 DownloadMessageHeadersCompleted is raised when the DownloadMessageHeadersAsync completes. In the event handler method of the DownloadMessageHeadersCompleted, 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 download headers of a message:

      Task-based approach

      using System;
      using System.IO;
      using ComponentPro;
      using ComponentPro.Net.Mail;
      
      ...
      
      public async void DoDownloadMessageHeadersAsync()
      {
          // 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");
      
          MemoryStream stream = new MemoryStream();
          // Download a mail message's headers with sequence number 1 to the specified stream. 
          await client.DownloadMessageHeadersAsync(1, stream);
      
          // ... 
       
          // Load the message for reading. 
          stream.Seek(0, SeekOrigin.Begin);
          MailMessage msg = new MailMessage(stream);
      
          Console.WriteLine("Message downloaded successfully.");
      
          foreach (Header h in msg.Headers)
          {
              Console.WriteLine("Header Name: {0}, Value: {1}", h.Name, h.Raw);
          }
      
          // Disconnect. 
          client.Disconnect();
      }
      
      void client_DownloadMessageHeadersCompleted(object sender, ExtendedAsyncCompletedEventArgs<long> e)
      {
          // Imap client = (Imap)sender; 
          if (e.Error != null)
          {
              Console.WriteLine("Error: " + e.Error.ToString());
          }
          else 
          {
              Stream stream = (Stream) e.UserState;
      
              // Load the message for reading. 
              MailMessage msg = new MailMessage(stream);
      
              Console.WriteLine("Message downloaded successfully.");
      
              foreach (Header h in msg.Headers)
              {
                  Console.WriteLine("Header Name: {0}, Value: {1}", h.Name, h.Raw);
              }
          }
      }
      

      Event-based approach

      using System;
      using System.IO;
      using ComponentPro;
      using ComponentPro.Net.Mail;
      
      ...
      
      public void DoDownloadMessageHeadersAsync()
      {
          // 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.DownloadMessageHeadersCompleted += client_DownloadMessageHeadersCompleted;
      
          // Select 'INBOX' mailbox. 
          client.Select("INBOX");
      
          MemoryStream stream = new MemoryStream();
          // Download a mail message's headers with sequence number 1 to the specified stream. 
          client.DownloadMessageHeadersAsync(1, stream, stream);
      
          // ... 
       
          // Disconnect. 
          client.Disconnect();
      }
      
      void client_DownloadMessageHeadersCompleted(object sender, ExtendedAsyncCompletedEventArgs<long> e)
      {
          // Imap client = (Imap)sender; 
          if (e.Error != null)
          {
              Console.WriteLine("Error: " + e.Error.ToString());
          }
          else 
          {
              Stream stream = (Stream) e.UserState;
      
              stream.Seek(0, SeekOrigin.Begin);
      
              // Load the message for reading. 
              MailMessage msg = new MailMessage(stream);
      
              Console.WriteLine("Message downloaded successfully.");
      
              foreach (Header h in msg.Headers)
              {
                  Console.WriteLine("Header Name: {0}, Value: {1}", h.Name, h.Raw);
              }
          }
      }