يمكن أن تستغرق ملفات Microsoft Project الكبيرة بصيغة MPP وPrimavera بصيغة XER من بضع ثوانٍ إلى عدة دقائق للتحليل. أثناء ذلك، يبدو التطبيق البسيط متجمدًا: لا شريط تقدم، لا نص حالة، ولا شيء يمكن للمستخدم اتخاذ إجراء بشأنه. يحتاج أي شخص يقوم بتحميل جداول زمنية كبيرة إلى طريقة لعرض مدى تقدم التحميل، وطريقة لإيقاف عملية تستغرق وقتًا طويلاً.
هذا الدليل يغطي كلاهما باستخدام Aspose.Tasks for .NET. ستقوم بإنشاء رد نداء للتقدم يُبلغ عن المرحلة الحالية والنسبة المئوية، وتوصيله بعملية التحميل، والحفاظ على استجابة واجهة المستخدم المكتبية بينما يتم تشغيل التحليل في خيط خلفي، وإلغاء التحميل الذي يتجاوز ميزانية الوقت.
النقاط الرئيسية
IProgressNotificationCallback.Notify(ProgressNotificationArgs)هو الطريقة الوحيدة التي تقوم بتنفيذها لتلقي تقدم التحميل من Aspose.Tasks for .NET.ProgressNotificationArgsتعرضCurrentStepNameوCurrentStepProgress(0–100) وEstimatedTotalProgress(0–100).- قم بإرفاق الـ callback باستخدام
LoadOptions.ProjectLoadingCallback؛ وهو مدعوم لتنسيقات MPP و XER. Notifyتعمل على خيط التحميل، لذا يجب نقل القيم إلى خيط واجهة المستخدم قبل تحديث أي عنصر تحكم.- ألغِ عملية التحميل البطيئة عن طريق تعيين
LoadOptions.CancellationTokenواستدعاءCancel()على كائنCancellationTokenSourceالخاص به من خيط آخر. - واجهة برمجة تطبيقات التقدم تعمل في وضع التقييم؛ الترخيص يزيل فقط حدود حجم الملف والإخراج.
جديد على المكتبة؟ صفحة منتج Aspose.Tasks for .NET و التوثيق يغطيان الإعداد والترخيص بالكامل.
كيف تراقب تقدم تحميل المشروع في C#؟
قم بتنفيذ IProgressNotificationCallback، وضعه على LoadOptions.ProjectLoadingCallback، وحمّل الملف عبر مُنشئ Project الذي يقبل LoadOptions. الحد الأدنى من الكود العامل يتكون من ثلاثة أجزاء: فئة رد الاتصال، مثيل LoadOptions، واستدعاء التحميل.
- الإدخال: ملف MPP أو XER، على سبيل المثال
BigProject.mpp - الإخراج: تحديثات التقدم أثناء التحليل —
CurrentStepName,CurrentStepProgress,EstimatedTotalProgress - المكتبة: Aspose.Tasks for .NET
- اللغة: C#
using System;
using Aspose.Tasks;
internal sealed class ConsoleProgressCallback : IProgressNotificationCallback
{
public void Notify(ProgressNotificationArgs args)
{
Console.WriteLine(
"{0}: step {1}% / total {2}%",
args.CurrentStepName,
args.CurrentStepProgress,
args.EstimatedTotalProgress);
}
}
internal static class Program
{
private static void Main()
{
// A license is optional here. Uncomment to remove evaluation limits.
// new License().SetLicense("Aspose.Tasks.lic");
var loadOptions = new LoadOptions
{
ProjectLoadingCallback = new ConsoleProgressCallback()
};
var project = new Project("BigProject.mpp", loadOptions);
Console.WriteLine("Loaded {0} top-level tasks.", project.RootTask.Children.Count);
}
}
عند تحليل الملف، يتم تشغيل Notify عدة مرات وتظهر وحدة التحكم المرحلة والنسب المئوية. بعد عودة المُنشئ، يكون كائن Project محمَّلاً بالكامل ويمكن استخدامه.
لماذا يعتبر مراقبة تقدم التحميل مهمًا للملفات الكبيرة؟
إنه يستبدل الوقفة التي تبدو غير مستجيبة بتغذية مرئية، وهو الفرق بين التطبيق الذي يبدو معطلاً والتطبيق الذي يبدو مشغولاً. كلما كان الملف أكبر، كلما طالت عملية التحليل، وكلما ارتفعت تكلفة التحميل العشوائي في جودة الإدراك.
استخدامات ملموسة لقيم التقدم:
- تشغيل شريط تقدم محدد باستخدام
EstimatedTotalProgressبدلاً من إظهار مؤشر دوران غير محدد. - تسجيل تحولات
CurrentStepNameلتحديد أي مرحلة تهيمن على وقت التحميل عند تحليل ملف بطيء. - الحفاظ على استجابة واجهة المستخدم عن طريق التحميل في خيط خلفي وإرسال التقدم إلى خيط واجهة المستخدم.
- عرض تقدم لكل ملف في أداة دفعة تقوم بتحويل أو ترحيل العديد من المشاريع بالتتابع.
كيف تقوم بتثبيت Aspose.Tasks وإعداد المشروع؟
أضف حزمة Aspose.Tasks NuGet إلى مشروع .NET 6 أو أحدث.
dotnet add package Aspose.Tasks
أو، من وحدة تحكم مدير الحزم في Visual Studio:
Install-Package Aspose.Tasks
يعمل رد الاتصال الخاص بالتقدم بدون ترخيص. إذا كنت بحاجة إلى تحميل ملفات تتجاوز حد حجم التقييم أو المعالجة بدون قيود التقييم، قم بتعيين ترخيص مرة واحدة عند بدء التشغيل:
using Aspose.Tasks;
var license = new License();
license.SetLicense("Aspose.Tasks.lic");
يمكنك طلب ترخيص مؤقت مجاني من صفحة ترخيص Aspose المؤقتة، وقراءة المزيد عن المكتبة على صفحة منتج Aspose.Tasks for .NET.
ما الذي يقدمه API IProgressNotificationCallback؟
واجهة برمجة التطبيقات هي واجهة واحدة، طريقة واحدة، ونوع معامل واحد، جميعها في مساحة الاسم Aspose.Tasks.
| العضو | النوع | الوصف |
|---|---|---|
IProgressNotificationCallback.Notify(ProgressNotificationArgs) | void | يتم استدعاؤه أثناء عمليات المشروع طويلة الأمد للإبلاغ عن التقدم. |
ProgressNotificationArgs.CurrentStepName | string (get) | اسم المرحلة الحالية للعملية. |
ProgressNotificationArgs.CurrentStepProgress | int (get) | النسبة المئوية المقدرة للإنجاز للمرحلة الحالية، 0–100. |
ProgressNotificationArgs.EstimatedTotalProgress | int (get) | النسبة المئوية المقدرة للإنجاز للعملية بأكملها، 0–100. |
LoadOptions.ProjectLoadingCallback | IProgressNotificationCallback (get/set) | دالة الاستدعاء التي تُستدعى أثناء التحميل. مدعومة لـ MPP و XER. |
LoadOptions.CancellationToken | System.Threading.CancellationToken (get/set) | الرمز المميز المستخدم لإلغاء عملية تحميل جارية. |
ProgressNotificationArgs مغلق ويشتق من EventArgs. جميع خصائصه الثلاثة هي للقراءة فقط.
كيف تقوم بتنفيذ رد نداء إشعار التقدم؟
أنشئ فئة تُنفّذ IProgressNotificationCallback وقم بعمل شيء مفيد باستخدام ProgressNotificationArgs داخل Notify. احرص على أن تكون الطريقة سريعة، لأنها تُنفّذ على خيط التحميل.
using System;
using Aspose.Tasks;
internal sealed class ConsoleProgressCallback : IProgressNotificationCallback
{
private int lastTotal = -1;
public void Notify(ProgressNotificationArgs args)
{
// Only redraw when the total percentage actually changes.
if (args.EstimatedTotalProgress == lastTotal)
{
return;
}
lastTotal = args.EstimatedTotalProgress;
Console.WriteLine("[{0,3}%] {1}", args.EstimatedTotalProgress, args.CurrentStepName);
}
}
الحارس على lastTotal يمنع إغراق وحدة التحكم بالسطور المكررة عندما تقوم عدة استدعاءات Notify بالإبلاغ عن نفس الإجمالي.
كيف تقوم بتحميل مشروع مع تتبع التقدم؟
قم بتعيين ProjectLoadingCallback على كائن LoadOptions، ثم مرره إلى مُنشئ Project. يتم تشغيل التحميل بشكل متزامن؛ عندما يعود المُنشئ، تكون عملية التحليل مكتملة.
using System;
using Aspose.Tasks;
internal static class Loader
{
public static Project Load(string path)
{
var loadOptions = new LoadOptions
{
ProjectLoadingCallback = new ConsoleProgressCallback()
};
// Same call for MPP and XER; only the file path changes.
var project = new Project(path, loadOptions);
Console.WriteLine("Done. Root task children: {0}", project.RootTask.Children.Count);
return project;
}
}
هل تجرب هذا وفق جداولك الخاصة؟ قم بتنزيل ترخيص مؤقت مجاني لتشغيل الأحمال دون حد التقييم لحجم الملف.
كيف تحافظ على استجابة واجهة المستخدم أثناء التحميل؟
حمّل على خيط خلفي وانقل قيم التقدم إلى خيط واجهة المستخدم داخل رد النداء، لأن Notify يعمل على أي خيط استدعى مُنشئ Project.
using System.Windows.Forms;
using Aspose.Tasks;
internal sealed class ProgressBarCallback : IProgressNotificationCallback
{
private readonly ProgressBar bar;
public ProgressBarCallback(ProgressBar bar) => this.bar = bar;
public void Notify(ProgressNotificationArgs args)
{
if (bar.InvokeRequired)
{
bar.BeginInvoke(() => bar.Value = args.EstimatedTotalProgress);
}
else
{
bar.Value = args.EstimatedTotalProgress;
}
}
}
في WPF، استخدم Dispatcher.Invoke أو Dispatcher.BeginInvoke بدلاً من Control.BeginInvoke.
كيف تلغي عملية تحميل طويلة الأمد؟
Set LoadOptions.CancellationToken إلى رمز من CancellationTokenSource، ثم استدعِ Cancel() على ذلك المصدر من خيط آخر. يتوقف Aspose.Tasks عن التحليل ويُطلق مُنشئ Project استثناءً، لذا قم بلفه داخل try/catch.
using System;
using System.Threading;
using Aspose.Tasks;
var cts = new CancellationTokenSource();
var loadOptions = new LoadOptions
{
ProjectLoadingCallback = new ConsoleProgressCallback(),
CancellationToken = cts.Token
};
// Wire a Cancel button or a timeout to this:
// cts.CancelAfter(TimeSpan.FromSeconds(30));
try
{
var project = new Project("BigProject.xer", loadOptions);
Console.WriteLine("Loaded {0} tasks.", project.RootTask.Children.Count);
}
catch (Exception ex)
{
Console.WriteLine("Load stopped: {0}", ex.Message);
}
الخلاصة
إضافة تقدم التحميل إلى تطبيق Aspose.Tasks for .NET هو تغيير بسيط له تأثير كبير على الاستجابة المتصورة. قم بتنفيذ IProgressNotificationCallback، وعيّنها إلى LoadOptions.ProjectLoadingCallback، واقرأ CurrentStepName و CurrentStepProgress و EstimatedTotalProgress داخل Notify. أضف CancellationToken عندما يمكن أن تستغرق عمليات التحميل وقتًا طويلاً بحيث قد يرغب المستخدم في إيقافها.
استكشف وثائق Aspose.Tasks for .NET ومرجع API للمزيد، وقم بتنزيل ترخيص مؤقت مجاني لتقييم دون حدود.
الأسئلة المتكررة
هل أحتاج إلى ترخيص مدفوع لاستخدام واجهة برمجة تطبيقات إشعارات التقدم؟
لا. IProgressNotificationCallback يعمل في وضع التقييم. الترخيص المؤقت أو المدفوع يزيل فقط حدود التقييم على حجم الملف والإخراج؛ لكنه لا يفتح واجهة برمجة تطبيقات التقدم.
هل يعمل نفس رد النداء للملفات XER وكذلك MPP؟
نعم. LoadOptions.ProjectLoadingCallback مدعوم حاليًا لتنسيقات MPP و XER. نفس تنفيذ IProgressNotificationCallback يتعامل مع كليهما.
هل استدعاء التقدم آمن من حيث الخيوط؟
Notify يتم استدعاؤه على الخيط الذي ينفّذ التحميل، وليس على خيط خلفي. في تطبيق سطح المكتب، قم بنقل القيم إلى خيط واجهة المستخدم باستخدام Control.Invoke أو Dispatcher.Invoke قبل تعديل شريط التقدم.
ما هو الفرق بين CurrentStepProgress و EstimatedTotalProgress؟
CurrentStepProgress هو النسبة المئوية المكتملة للمرحلة الحالية من التحميل، مثل قراءة المهام أو قراءة الموارد. EstimatedTotalProgress هو النسبة المئوية المقدرة المكتملة للعملية بأكملها. كلاهما أعداد صحيحة من 0 إلى 100.
هل يمكنني إلغاء التحميل من داخل رد النداء؟
ليس من داخل Notify مباشرة. بدلاً من ذلك، قم بتعيين LoadOptions.CancellationToken إلى رمز من CancellationTokenSource واستدعِ Cancel() على ذلك المصدر من خيط آخر. ثم يتوقف مُنشئ Project ويرمي استثناءً، لذا قم بلفه داخل try/catch.
هل إضافة callback يبطئ التحميل؟
إن عبء الـ callback ضئيل لأن Notify يتم استدعاؤه في عدد قليل من نقاط التفتيش، وليس لكل سجل. احرص على أن تكون الطريقة خفيفة الوزن، لأن أي عمل تقوم به داخلها يتم تشغيله على خيط التحميل.
