Đếm các mục trong bản sao lưu Zimbra TGZ lớn có thể mất một thời gian. Nếu bạn thực hiện việc đếm trên luồng chính của ứng dụng desktop hoặc trong một yêu cầu web, mọi thứ khác sẽ chờ cho đến khi nó hoàn thành. Aspose.Email for .NET cung cấp các phiên bản bất đồng bộ của các phương pháp đếm TGZ, vì vậy bạn có thể await kết quả và dừng việc đếm nếu nó chạy quá lâu.
Hướng dẫn này dành cho các nhà phát triển .NET đã sử dụng async và await. Nếu bạn chỉ cần đếm nhanh trong một công cụ console hoặc script, phiên bản thường đơn giản hơn; xem Đếm tin nhắn trong các tệp TGZ bằng TgzReader.GetItemsCount.
Cách đếm các mục trong bản sao lưu TGZ của Zimbra một cách bất đồng bộ
Có hai phương thức bất đồng bộ: một trả về tổng số mục trong kho lưu trữ, và phương thức còn lại trả về số mục của một loại, chẳng hạn như tin nhắn hoặc danh bạ. Chúng trả về cùng các số như các phương thức thông thường. Sự khác biệt là mã của bạn có thể thực hiện công việc khác trong khi kho lưu trữ đang được đọc.
Cả hai phương thức cũng chấp nhận một cancellation token tùy chọn. Đó là cách bạn thêm thời gian chờ, kết nối nút Cancel, hoặc dừng công việc khi một yêu cầu web bị bỏ qua.
Bắt đầu với Aspose.Email
Cài đặt Aspose.Email for .NET 26.9 hoặc phiên bản mới hơn từ NuGet:
Install-Package Aspose.Email
Bạn cũng cần một bản sao lưu Zimbra TGZ. Các ví dụ sử dụng tệp có tên xhy.tgz.
Đếm các mục TGZ Zimbra một cách bất đồng bộ
Chương trình sau sẽ lấy tổng số mục, sau đó đếm tin nhắn và danh bạ.
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}");
}
}
}
Chương trình in tổng số mục, tiếp theo là số tin nhắn và danh bạ trong bản sao lưu.
Một vài điều cần lưu ý:
Mainđược đánh dấuasyncđể nó có thể chờ các đếm mà không bị chặn.- Mỗi lần đếm hoàn thành trước khi lần tiếp theo bắt đầu.
- Khối
usinggiải phóng tệp lưu trữ một khi cả ba lần đếm đã hoàn thành.
Dừng một đếm với thời gian chờ
Để giới hạn thời gian một phép đếm có thể chạy, hãy tạo một token hủy với thời gian giới hạn và truyền nó vào. Ví dụ này sẽ dừng lại sau 30 giây:
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}");
}
Thêm using System.Threading; cho các kiểu hủy.
Token giống nhau hoạt động cho các tình huống khác. Trong một ứng dụng desktop, giữ nguồn token trong một trường và hủy nó khi người dùng nhấn Cancel. Trong một ứng dụng ASP.NET Core, truyền token báo hiệu khi client ngắt kết nối, để đếm dừng lại nếu không có ai đang chờ câu trả lời.
Khi một đếm bị hủy, hãy xử lý nó theo cách bạn xử lý việc hủy ở các phần khác trong mã async của mình, ví dụ bằng cách hiển thị một thông báo hoặc cho phép người dùng thử lại.
Các bước tiếp theo
Sau khi đếm, bạn cũng có thể xuất bản sao lưu một cách bất đồng bộ; phương thức xuất cũng chấp nhận một token hủy. Tài liệu Working with Zimbra và TgzReader API reference đề cập đến các việc khác bạn có thể thực hiện với bản sao lưu TGZ. Nếu bạn có câu hỏi, hãy hỏi trên Aspose.Email support forum.
Câu hỏi thường gặp
Tại sao đếm bất đồng bộ? Trong khi lưu trữ đang được đọc, ứng dụng của bạn có thể tiếp tục thực hiện các công việc khác. Ứng dụng desktop sẽ vẫn phản hồi, và máy chủ web sẽ không bị kẹt một luồng đang chờ.
Tôi có thể hủy một phép đếm mất quá lâu không? Có. Cả hai phương pháp đếm bất đồng bộ đều chấp nhận một token hủy tùy chọn.
Các loại mục nào tôi có thể đếm? Tin nhắn, danh bạ, mục lịch và công việc.
Có cần token hủy không? Không. Nó là tùy chọn. Nếu bạn không truyền token, quá trình đếm sẽ chạy đến khi hoàn thành.
Tôi có cần giải phóng bộ đọc không? Có. Sử dụng khối
usingđể tệp lưu trữ được giải phóng khi bạn hoàn thành.
Nhận giấy phép miễn phí và khám phá thêm
Yêu cầu một giấy phép tạm thời miễn phí để thử Aspose.Email for .NET mà không có các hạn chế đánh giá.
