大規模な Zimbra TGZ バックアップ内のアイテムを数えるには時間がかかることがあります。デスクトップアプリのメインスレッド上や Web リクエスト内でカウントを実行すると、他のすべてが完了するまで待機します。Aspose.Email for .NET は TGZ カウントメソッドの非同期バージョンを追加しているため、結果を await でき、カウントが長時間実行される場合は停止できます。

このチュートリアルは、すでに async と await を使用している .NET 開発者向けです。コンソール ツールやスクリプトで簡単に件数を取得したいだけの場合は、通常バージョンの方がシンプルです。詳細は TgzReader.GetItemsCount を使用した TGZ ファイル内のメッセージ数のカウント を参照してください。

Zimbra TGZ バックアップ内の項目を非同期にカウントする方法

非同期メソッドは2つあります。1つはアーカイブ内のアイテム総数を返し、もう1つはメッセージや連絡先など、特定のタイプのアイテム数を返します。これらは通常のメソッドと同じ数値を返します。違いは、アーカイブを読み取っている間にコードが他の処理を自由に実行できることです。

両方のメソッドはオプションのキャンセレーショントークンも受け取ります。これにより、タイムアウトを設定したり、キャンセルボタンを接続したり、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 ブロックは、3 つのカウントがすべて完了した後にアーカイブ ファイルを解放します。

タイムアウトでカウントを停止する

カウントの実行時間を制限するには、時間制限付きのキャンセレーショントークンを作成して渡します。この例では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 アプリでは、クライアントが切断されたことを示すトークンを渡すことで、誰も回答を待っていない場合にカウントが停止します。

カウントがキャンセルされた場合、非同期コードの他の場所でキャンセルを処理する方法と同様に処理してください。たとえば、メッセージを表示したり、ユーザーに再試行させたりします。

次のステップ

カウント後、バックアップを非同期でエクスポートすることもできます。エクスポート メソッドはキャンセル トークンも受け取ります。
Zimbra の使用方法 のドキュメントと TgzReader API リファレンス では、TGZ バックアップでできるその他のことが説明されています。質問がある場合は、Aspose.Email サポート フォーラム で質問してください。

よくある質問

  1. なぜ非同期でカウントするのか? アーカイブが読み込まれている間、アプリケーションは他の作業を続けることができます。デスクトップアプリは応答性を保ち、Webサーバーはスレッドを待機させることがありません。

  2. 時間がかかりすぎるカウントをキャンセルできますか? はい。両方の非同期カウント メソッドはオプションのキャンセルトークンを受け付けます。

  3. カウントできるアイテムの種類は何ですか? メッセージ、連絡先、カレンダー アイテム、タスク。

  4. キャンセルトークンは必要ですか? いいえ。オプションです。渡さない場合、カウントは完了まで実行されます。

  5. リーダーを破棄する必要がありますか? はい。using ブロックを使用すると、完了時にアーカイブ ファイルが解放されます。

無料ライセンスを取得して、さらに探索する

評価制限なしで Aspose.Email for .NET をテストするために、無料の一時ライセンス をリクエストしてください。

関連項目