在大型 Zimbra TGZ 备份中统计项目可能需要一段时间。如果在桌面应用的主线程或 Web 请求中运行统计,其他所有操作都会等待它完成。Aspose.Email for .NET 提供了其 TGZ 计数方法的异步版本,这样您可以 await 结果,并在计数时间过长时停止计数。

本教程面向已经使用 async 和 await 的 .NET 开发者。如果您只需要在控制台工具或脚本中快速计数,常规版本更简单;请参阅 使用 TgzReader.GetItemsCount 统计 TGZ 文件中的邮件数量。

如何异步统计 Zimbra TGZ 备份中的项目

有两种异步方法:一种返回存档中的项目总数,另一种返回单一类型的项目数量,例如消息或联系人。它们返回的数字与常规方法相同。不同之处在于,当存档被读取时,您的代码可以自由地执行其他工作。

这两种方法也接受可选的取消令牌。这就是添加超时、连接取消按钮或在 Web 请求被放弃时停止工作的方式。

开始使用 Aspose.Email

安装 Aspose.Email for .NET 26.9 或更高版本,来自 NuGet:

Install-Package Aspose.Email

您还需要一个 Zimbra TGZ 备份。示例使用名为 xhy.tgz 的文件。

异步统计 Zimbra TGZ 项目

以下程序获取项目的总数,然后统计消息和联系人。

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;。

相同的令牌在其他情况下也适用。在桌面应用程序中,将令牌源保存在字段中,并在用户单击 Cancel 时取消它。在 ASP.NET Core 应用程序中,传递指示客户端断开连接的令牌,这样如果没有人等待答案,计数就会停止。

当计数被取消时,按照在异步代码中处理取消的方式来处理它,例如显示一条消息或让用户再次尝试。

下一步

计数完成后,您也可以异步导出备份;导出方法同样接受取消令牌。有关 TGZ 备份的其他操作,请参阅 使用 Zimbra 文档和 TgzReader API 参考。如果有任何疑问,请在 Aspose.Email 支持论坛 提问。

FAQs

  1. 为什么要异步计数? 在读取归档的同时,您的应用程序可以继续执行其他工作。桌面应用保持响应,Web 服务器也不会因为等待而占用线程。

  2. 我可以取消耗时过长的计数吗? 是的。两种异步计数方法都接受可选的取消令牌。

  3. 我可以计数哪些项目类型?
    邮件、联系人、日历项和任务。

  4. 是否需要取消令牌? 不需要。它是可选的。如果您不传递取消令牌,计数将运行到完成。

  5. 我需要释放读取器吗? 是的。使用 using 块,以便在完成后释放归档文件。

获取免费许可证并探索更多

请求一个免费临时许可证来测试 Aspose.Email for .NET 而无需评估限制。

另请参阅