Использование асинхронных операций в EWSClient

В отличие от синхронных методов, асинхронные методы не блокируют и позволяют выполнять несколько запросов одновременно. Асинхронные методы называются постфиксом Async.

NOTE: Асинхронные методы доступны в версиях, ориентированных на .NET Core, .NET Framework 4.5 и более поздних.

Внедрение IAsyncTokenProvider для асинхронного получения токенов OAuth

Следующий пример кода определяет SomeAsyncTokenProvider класс, который реализует IAsyncTokenProvider интерфейс. Класс реализует GetAccessTokenAsync асинхронный метод, возвращающий задачу типа OAuthToken. Этот метод выбирает действительное OAuthToken asynchronously.

private class SomeAsyncTokenProvider : IAsyncTokenProvider
{
    public SomeAsyncTokenProvider( /*some parameters*/)
    {
        ...
    }

    public async Task<OAuthToken> GetAccessTokenAsync(bool ignoreExistingToken = false,
        CancellationToken cancellationToken = default)
    {
        //Some asynchronous code to get a valid OAuthToken
        ...
    }

    public void Dispose()
    {
        ...
    }
}

Создание экземпляра IAsyncewsClient

В следующем примере кода клиент Exchange Web Services (EWS) асинхронно используется аутентификация OAuth. В коде выполняются следующие шаги:

  1. Создает новое CancellationToken объект, который можно использовать для отмены асинхронных операций.
  2. Instantiates SomeAsyncTokenProvider класс, реализующий IAsyncTokenProvider интерфейс. Этот класс используется в качестве параметра для построения нового OAuthNetworkCredential object.
  3. Присваивает URI почтового ящика конечной точке веб-служб Exchange.
  4. Звонит GetEwsClientAsync метод EWSClient класс с mailboxUri and OAuthNetworkCredential объект в качестве параметров. Этот метод возвращает объект Task, поэтому он ожидает результата, прежде чем продолжить. cancellationToken объект передается в качестве необязательного параметра в GetEwsClientAsync method.
//The cancellationToken can be used
var cancellationToken = new CancellationToken();

//Create IAsyncEwsClientInstance
IAsyncTokenProvider tokenProvider = new SomeAsyncTokenProvider(/*some parameters*/);
const string mailboxUri = "https://outlook.office365.com/ews/exchange.asmx";
var ewsClient = await EWSClient.GetEwsClientAsync(mailboxUri, new OAuthNetworkCredential(tokenProvider),
    cancellationToken: cancellationToken);

Отправка сообщения

В приведенном ниже примере кода предпринята попытка асинхронной отправки сообщения электронной почты. Код выполняет следующие шаги:

  1. Создает новое MailMessage объект с параметрами сообщения.
  2. Звонит SendAsync метод EWSClient объект, передающий MailMessage в качестве параметра. Метод ожидается, так как он возвращает объект Task. cancellationToken объект передается в качестве необязательного параметра в SendAsync method.
MailMessage message = new MailMessage("from@aspose.com", "to@aspose.com", "Some subject", "Some body");
await ewsClient.SendAsync(message, cancellationToken: cancellationToken);

Получение сообщения с вложениями

Чтобы получить сообщение электронной почты в асинхронном режиме, используйте следующий пример кода с описанными ниже шагами:

  1. Позвоните FetchItemAsync метод EWSClient. Метод принимает два параметра:

    • messageUri это строка, представляющая URI сообщения, которое нужно получить
    • cancellationToken необязательный параметр, который можно использовать для отмены асинхронной операции. Метод возвращает объект Task, который преобразуется в MapiMessage объект после завершения асинхронной операции. Ключевое слово «await» используется для ожидания завершения объекта Task перед продолжением.
  2. Присвоить fetched переменная — результат выполнения Задачи, который представляет собой MapiMessage объект, содержащий данные полученного сообщения.

       var fetched = await ewsClient.FetchItemAsync(messageUri, cancellationToken: cancellationToken);
    

Добавление сообщений

В приведенном ниже примере кода предпринимается попытка асинхронного добавления сообщений электронной почты. Код выполняет следующие шаги:

  1. Звонит AppendMessagesAsync метод EWSclient объект. Метод принимает EwsAppendMessage объект, содержащий параметры: добавляемые сообщения, URI целевой папки и токен отмены.

  2. Создает EwsAppendMessage объект, использующий Create метод и настраивает его с помощью следующих вызовов методов:

    • AddMessage добавляет сообщение к операции добавления.
    • SetFolder задает URI целевой папки для операции добавления.
    • SetCancellationToken задает токен отмены, который можно использовать для отмены асинхронной операции.
  3. The AppendMessagesAsync метод возвращает объект Task, который преобразуется в IEnumerable объект после завершения асинхронной операции. Ключевое слово «await» используется для ожидания завершения объекта Task перед продолжением.

  4. The uris переменной присваивается результат выполнения Задачи, который представляет собой IEnumerable объект, содержащий URI добавленных сообщений.

IEnumerable<string> uris = await ewsClient.AppendMessagesAsync(
    EwsAppendMessage.Create()
        .AddMessage(message)
        .AddMessage(fetched)
        .SetFolder(folderUri)
        .SetCancellationToken(cancellationToken));

Копирование элементов

В приведенном ниже примере кода показано, как копировать элементы, и выполняются следующие шаги:

  1. Звонит CopyItemAsync метод EWSClient объект. Метод принимает три параметра:

    • messageUri строка, представляющая URI копируемого сообщения
    • destinationFolderUri это строка, представляющая URI целевой папки
    • cancellationToken необязательный параметр, который можно использовать для отмены асинхронной операции.

    Метод возвращает объект Task, который после завершения асинхронной операции преобразуется в строку. Ключевое слово «await» используется для ожидания завершения объекта Task перед продолжением.

  2. newItemUri переменной присваивается результат выполнения Задачи, представляющий собой строку, содержащую URI вновь созданной копии сообщения.

string newItemUri = await ewsClient.CopyItemAsync(messageUri, destinationFolderUri, cancellationToken);

Удаление элементов

Следующий код пытается асинхронно удалить сообщение электронной почты.

Оно называет DeleteItemAsync метод объекта EWSClient. Метод принимает три параметра:

  • newItemUri строка, представляющая URI удаляемого элемента
  • DeletionOptions.DeletePermanently указывает, что элемент должен быть удален навсегда
  • cancellationToken необязательный параметр, который можно использовать для отмены асинхронной операции.

Метод возвращает объект Task, который завершается после завершения асинхронной операции. Ключевое слово «await» используется для ожидания завершения объекта Task перед продолжением.

await ewsClient.DeleteItemAsync(newItemUri, DeletionOptions.DeletePermanently, cancellationToken);

Удаление папок

Следующий код пытается асинхронно удалить папку.

Оно называет DeleteFolderAsync метод объекта EWSClient. Метод принимает три параметра:

  • folderUri строка, представляющая URI удаляемой папки
  • deletePermanently указывает, следует ли удалить папку навсегда или переместить ее в папку «Удаленные элементы»
  • cancellationToken необязательный параметр, который можно использовать для отмены асинхронной операции.

Метод возвращает объект Task, который завершается после завершения асинхронной операции. Ключевое слово «await» используется для ожидания завершения объекта Task перед продолжением.

const bool deletePermanently = true;
await ewsClient.DeleteFolderAsync(folderUri, deletePermanently, cancellationToken);

Обновление элементов

В приведенном ниже примере кода предпринята попытка асинхронного обновления элемента. Он выполняет следующие шаги:

  1. Создает EwsUpdateItem объект, использующий Create метод, передающий объект элемента. EWSupdateItem представляет собой параметры операции обновления. SetCancellationToken метод вызывается на EwsUpdateItem объект, проходящий в cancellationToken параметр, который является необязательным параметром, который можно использовать для отмены асинхронной операции.
  2. Передает EwsUpdateItem объект в качестве параметра для UpdateItemAsync метод EWSClient.
  3. The UpdateItemAsync метод возвращает объект Task, который завершается после завершения асинхронной операции. Ключевое слово «await» используется для ожидания завершения объекта Task перед продолжением.
await ewsClient.UpdateItemAsync(
    EwsUpdateItem.Create(mapiNote)
        .SetCancellationToken(cancellationToken));