يمكن أن يستغرق عد العناصر في نسخة احتياطية كبيرة من Zimbra بصيغة TGZ بعض الوقت. إذا قمت بتشغيل العد على الخيط الرئيسي لتطبيق سطح المكتب أو داخل طلب ويب، ينتظر كل شيء آخر حتى ينتهي. يضيف Aspose.Email for .NET إصدارات غير متزامنة من طرق عد TGZ الخاصة به، بحيث يمكنك await النتيجة وإيقاف العد إذا استغرق وقتًا طويلاً.

هذا البرنامج التعليمي موجه لمطوري .NET الذين يستخدمون بالفعل async و await. إذا كنت تحتاج فقط إلى عدد سريع في أداة سطر الأوامر أو سكريبت، فإن النسخة العادية أبسط؛ راجع Count Messages in TGZ Files with TgzReader.GetItemsCount.

كيفية عد العناصر في نسخ احتياطية Zimbra TGZ بشكل غير متزامن

هناك طريقتان غير متزامنتان: الأولى تُعيد إجمالي عدد العناصر في الأرشيف، والثانية تُعيد عدد العناصر من نوع واحد، مثل الرسائل أو جهات الاتصال. إنهما تُعيدان نفس الأرقام كما في الطرق العادية. الفرق هو أن شفرتك حرة للقيام بأعمال أخرى أثناء قراءة الأرشيف.

كلا الطريقتين تقبلان أيضًا رمز إلغاء اختياري. هذه هي الطريقة التي يمكنك من خلالها إضافة مهلة زمنية، ربط زر إلغاء، أو إيقاف العمل عندما يتم التخلي عن طلب ويب.

البدء مع 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; لأنواع الإلغاء.

يعمل نفس الرمز المميز في حالات أخرى. في تطبيق سطح المكتب، احتفظ بمصدر الرمز في حقل وألغِه عندما ينقر المستخدم على إلغاء. في تطبيق ASP.NET Core، مرّر الرمز الذي يشير إلى انقطاع اتصال العميل، بحيث يتوقف العد إذا لم يكن هناك أحد ينتظر الإجابة.

عند إلغاء العد، عالج ذلك بنفس الطريقة التي تتعامل بها مع الإلغاء في أماكن أخرى من شفرتك غير المتزامنة، على سبيل المثال عن طريق عرض رسالة أو السماح للمستخدم بالمحاولة مرة أخرى.

الخطوات التالية

بعد العد، يمكنك أيضًا تصدير النسخة الاحتياطية بشكل غير متزامن؛ طريقة التصدير تقبل أيضًا رمز إلغاء. تغطي وثائق العمل مع Zimbra ومرجع API لـ TgzReader الأشياء الأخرى التي يمكنك القيام بها مع نسخة احتياطية بصيغة TGZ. إذا كان لديك أسئلة، اسأل في منتدى دعم Aspose.Email.

الأسئلة المتكررة

  1. لماذا العد بشكل غير متزامن؟ أثناء قراءة الأرشيف، يمكن لتطبيقك الاستمرار في أداء أعمال أخرى. يظل تطبيق سطح المكتب مستجيبًا، ولا يقوم خادم الويب بحجز خيط انتظار.

  2. هل يمكنني إلغاء عملية العد التي تستغرق وقتًا طويلاً؟ نعم. كلا طريقتي العد غير المتزامنتين تقبلان رمز إلغاء اختياري.

  3. ما هي أنواع العناصر التي يمكنني عدّها؟ الرسائل، جهات الاتصال، عناصر التقويم، والمهام.

  4. هل يلزم وجود رمز إلغاء؟ لا. إنه اختياري. إذا لم تقم بتمريره، يستمر العد حتى الانتهاء.

  5. هل أحتاج إلى تحرير القارئ؟ نعم. استخدم كتلة using حتى يتم تحرير ملف الأرشيف عند الانتهاء.

احصل على ترخيص مجاني واستكشف المزيد

اطلب ترخيصًا مؤقتًا مجانيًا لاختبار Aspose.Email for .NET دون قيود التقييم.

انظر أيضًا