在大型 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
为什么要异步计数? 在读取归档的同时,您的应用程序可以继续执行其他工作。桌面应用保持响应,Web 服务器也不会因为等待而占用线程。
我可以取消耗时过长的计数吗? 是的。两种异步计数方法都接受可选的取消令牌。
我可以计数哪些项目类型?
邮件、联系人、日历项和任务。是否需要取消令牌? 不需要。它是可选的。如果您不传递取消令牌,计数将运行到完成。
我需要释放读取器吗? 是的。使用
using块,以便在完成后释放归档文件。
获取免费许可证并探索更多
请求一个免费临时许可证来测试 Aspose.Email for .NET 而无需评估限制。
