Подсчёт элементов в большом резервном копировании Zimbra в формате TGZ может занять некоторое время. Если выполнять подсчёт в основном потоке настольного приложения или внутри веб‑запроса, всё остальное ждёт, пока он завершится. Aspose.Email for .NET добавляет асинхронные версии своих методов подсчёта TGZ, так что вы можете await результат и остановить подсчёт, если он длится слишком долго.
Этот учебник предназначен для разработчиков .NET, которые уже используют async и await. Если вам нужен лишь быстрый подсчёт в консольном инструменте или скрипте, обычная версия проще; см. Подсчет сообщений в TGZ‑файлах с помощью TgzReader.GetItemsCount.
Как асинхронно подсчитать элементы в резервных копиях Zimbra TGZ
Существует два асинхронных метода: один возвращает общее количество элементов в архиве, а другой — количество элементов одного типа, например сообщений или контактов. Они возвращают те же числа, что и обычные методы. Разница в том, что ваш код может выполнять другую работу, пока архив читается.
Оба метода также принимают необязательный токен отмены. Именно так вы добавляете тайм‑аут, подключаете кнопку Cancel или останавливаете работу, когда веб‑запрос отменён.
Начало работы с Aspose.Email
Установите Aspose.Email for .NET 26.9 или более позднюю версию из NuGet:
Install-Package Aspose.Email
Вам также понадобится резервная копия Zimbra TGZ. В примерах используется файл с именем xhy.tgz.
Подсчет элементов TGZ Zimbra асинхронно
Следующая программа получает общее количество элементов, затем подсчитывает сообщения и контакты.
using System;
using System.Threading.Tasks;
using Aspose.Email.Storage.Zimbra;
class Program
{
static async Task Main()
{
var fileName = "xhy.tgz";
using (var reader = new TgzReader(fileName))
{
int totalItems = await reader.GetTotalItemsCountAsync();
int numberOfMessages = await reader.GetItemsCountAsync(ItemType.Message);
int numberOfContacts = await reader.GetItemsCountAsync(ItemType.Contact);
Console.WriteLine($"Total items: {totalItems}");
Console.WriteLine($"Messages: {numberOfMessages}");
Console.WriteLine($"Contacts: {numberOfContacts}");
}
}
}
Программа выводит общее количество элементов, а затем количество сообщений и контактов в резервной копии.
Несколько вещей, на которые стоит обратить внимание:
Mainпомеченasync, чтобы он мог ожидать подсчёты без блокировки.- Каждый подсчёт завершается до начала следующего.
- Блок
usingосвобождает файл архива после завершения всех трёх подсчётов.
Остановить подсчёт с тайм‑аутом
Чтобы ограничить, как долго может работать подсчёт, создайте токен отмены с ограничением по времени и передайте его. Этот пример прекращает работу через 30 секунд:
using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30)))
using (var reader = new TgzReader("xhy.tgz"))
{
int numberOfMessages = await reader.GetItemsCountAsync(ItemType.Message, cts.Token);
Console.WriteLine($"Messages: {numberOfMessages}");
}
Добавьте using System.Threading; для типов отмены.
Тот же токен работает в других ситуациях. В настольном приложении храните источник токена в поле и отменяйте его, когда пользователь нажимает Отмена. В приложении ASP.NET Core передавайте токен, который сигнализирует о разъединении клиента, чтобы подсчёт останавливался, если никто не ждёт ответа.
Когда счет отменяется, обрабатывайте его так же, как вы обрабатываете отмену в другом месте вашего асинхронного кода, например, показывая сообщение или позволяя пользователю попробовать снова.
Следующие шаги
После подсчёта вы также можете экспортировать резервную копию асинхронно; метод экспорта также принимает токен отмены. Документация Работа с Zimbra и справка API TgzReader охватывают остальные возможности работы с резервной копией TGZ. Если у вас есть вопросы, задавайте их на форуме поддержки Aspose.Email.
Часто задаваемые вопросы
Зачем подсчитывать асинхронно? Пока архив читается, ваше приложение может продолжать выполнять другую работу. Настольное приложение остаётся отзывчивым, а веб‑сервер не блокирует поток в ожидании.
Могу ли я отменить подсчёт, который занимает слишком много времени? Да. Оба асинхронных метода подсчёта принимают необязательный токен отмены.
Какие типы элементов я могу подсчитать? Сообщения, контакты, элементы календаря и задачи.
Требуется ли токен отмены? Нет. Это необязательно. Если вы не передадите его, подсчёт будет выполнен до завершения.
Нужно ли вызывать Dispose у читателя? Да. Используйте блок
using, чтобы файл архива был освобождён после завершения.
Получите бесплатную лицензию и узнайте больше
Запросите бесплатную временную лицензию для тестирования Aspose.Email for .NET без ограничений оценки.
