Large Microsoft Project MPP و Primavera XER فایل‌ها می‌توانند از چند ثانیه تا چند دقیقه برای تجزیه زمان ببینند. در حین این پردازش، یک برنامه ساده به نظر می‌رسد که متوقف شده است: هیچ نوار پیشرفت، هیچ متن وضعیت، هیچ چیزی که کاربر بتواند بر روی آن عمل کند. هر کسی که برنامه‌ریزی‌های بزرگ را بارگذاری می‌کند به روشی برای نشان دادن میزان پیشرفت بارگذاری نیاز دارد و روشی برای متوقف کردن آن که بیش از حد طولانی اجرا می‌شود.

این راهنما هر دو را با Aspose.Tasks for .NET پوشش می‌دهد. شما یک callback پیشرفت می‌سازید که فاز فعلی و درصد را گزارش می‌کند، آن را به فرآیند بارگذاری متصل می‌کنید، رابط کاربری دسکتاپ را در حین تجزیه که در یک رشته پس‌زمینه اجرا می‌شود، پاسخگو نگه می‌دارید و بارگذاری‌ای که از بودجه زمانی فراتر می‌رود را لغو می‌کنید.

نکات کلیدی

  • IProgressNotificationCallback.Notify(ProgressNotificationArgs) یک متد تک است که برای دریافت پیشرفت بارگذاری از Aspose.Tasks for .NET پیاده‌سازی می‌کنید.
  • ProgressNotificationArgs شامل CurrentStepName، CurrentStepProgress (0–100) و EstimatedTotalProgress (0–100) است.
  • کال‌بک را با LoadOptions.ProjectLoadingCallback متصل کنید؛ این ویژگی برای فرمت‌های MPP و XER پشتیبانی می‌شود.
  • Notify در رشته بارگذاری اجرا می‌شود، بنابراین قبل از به‌روزرسانی یک کنترل، مقادیر را به رشته UI منتقل کنید.
  • برای لغو بارگذاری کند، LoadOptions.CancellationToken را تنظیم کنید و از رشته دیگر با فراخوانی Cancel() بر روی CancellationTokenSource آن لغو کنید.
  • API پیشرفت در حالت ارزیابی کار می‌کند؛ یک لایسنس فقط محدودیت‌های اندازه فایل و خروجی را حذف می‌کند.

آیا برای اولین بار با کتابخانه کار می‌کنید؟ صفحه محصول Aspose.Tasks for .NET و مستندات به طور کامل راه‌اندازی و مجوزدهی را پوشش می‌دهند.

چگونه پیشرفت بارگذاری پروژه را در C# نظارت کنیم؟

پیاده‌سازی IProgressNotificationCallback، تنظیم آن در LoadOptions.ProjectLoadingCallback و بارگذاری فایل از طریق سازنده Project که LoadOptions را می‌پذیرد. حداقل کد کاری شامل سه بخش است: یک کلاس callback، یک نمونه LoadOptions و فراخوانی بارگذاری.

  • Input: یک فایل MPP یا XER، برای مثال BigProject.mpp
  • Output: به‌روزرسانی‌های پیشرفت در حین تجزیه — CurrentStepName, CurrentStepProgress, EstimatedTotalProgress
  • Library: Aspose.Tasks for .NET
  • Language: 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 را نصب کنید و پروژه را تنظیم کنید؟

پکیج NuGet Aspose.Tasks را به یک پروژه .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 product page مراجعه کنید.

API IProgressNotificationCallback چه چیزی را فراهم می‌کند؟

API یک رابط، یک متد و یک نوع آرگومان است که همگی در فضای نام Aspose.Tasks قرار دارند.

عضونوعتوضیح
IProgressNotificationCallback.Notify(ProgressNotificationArgs)voidدر طول عملیات طولانی‌مدت پروژه برای گزارش پیشرفت فراخوانی می‌شود.
ProgressNotificationArgs.CurrentStepNamestring (get)نام فاز فعلی عملیات.
ProgressNotificationArgs.CurrentStepProgressint (get)درصد تخمینی تکمیل برای فاز فعلی، 0 تا 100.
ProgressNotificationArgs.EstimatedTotalProgressint (get)درصد تخمینی تکمیل برای کل عملیات، 0 تا 100.
LoadOptions.ProjectLoadingCallbackIProgressNotificationCallback (get/set)کال‌بکی که در طول بارگذاری فراخوانی می‌شود. برای MPP و XER پشتیبانی می‌شود.
LoadOptions.CancellationTokenSystem.Threading.CancellationToken (get/set)توکنی که برای لغو بارگذاری در حال انجام استفاده می‌شود.

ProgressNotificationArgs یک کلاس sealed است و از 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 یک مقدار کل یکسان را گزارش می‌دهند.

چگونه یک پروژه را با ردیابی پیشرفت بارگذاری می‌کنید؟

در یک شیء LoadOptions، ProjectLoadingCallback را تنظیم کنید، سپس آن را به سازنده 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;
    }
}

آیا این را در برنامه‌های خود امتحان می‌کنید؟ دانلود یک لایسنس موقت رایگان تا بتوانید بدون محدودیت ارزیابی در اندازه فایل، بارها را اجرا کنید.

چگونه UI را هنگام بارگذاری پاسخگو نگه می‌دارید؟

بارگذاری را در یک رشته پس‌زمینه انجام دهید و مقادیر پیشرفت را درون فراخوانی به رشتهٔ UI منتقل کنید، زیرا 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، به‌جای Control.BeginInvoke از Dispatcher.Invoke یا Dispatcher.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 اختصاص دهید و داخل Notify مقادیر CurrentStepName، CurrentStepProgress و EstimatedTotalProgress را بخوانید. زمانی که بارگذاری‌ها می‌توانند به اندازه‌ای طولانی شوند که کاربر ممکن است بخواهد آن‌ها را متوقف کند، یک CancellationToken اضافه کنید.

به مستندات Aspose.Tasks for .NET مراجعه کنید و مرجع API را برای پیشرفت بیشتر بررسی کنید، و برای ارزیابی بدون محدودیت، یک مجوز موقت رایگان دانلود کنید.

سوالات متداول

آیا برای استفاده از API اعلان پیشرفت به یک لایسنس پولی نیاز دارم؟
خیر. IProgressNotificationCallback در حالت ارزیابی کار می‌کند. یک لایسنس موقت یا پولی فقط محدودیت‌های ارزیابی مربوط به اندازه فایل و خروجی را حذف می‌کند؛ اما API پیشرفت را باز نمی‌کند.

آیا همان callback برای فایل‌های XER همانند MPP نیز کار می‌کند؟
بله. LoadOptions.ProjectLoadingCallback در حال حاضر برای فرمت‌های MPP و XER پشتیبانی می‌شود. همان پیاده‌سازی IProgressNotificationCallback هر دو را مدیریت می‌کند.

آیا callback پیشرفت ایمن برای استفاده در چندنخی است؟
Notify در همان رشته‌ای که بارگذاری را اجرا می‌کند فراخوانی می‌شود، نه در یک رشته پس‌زمینه. در یک برنامه دسکتاپ، مقادیر را با استفاده از Control.Invoke یا Dispatcher.Invoke به رشته UI منتقل کنید قبل از اینکه به نوار پیشرفت دست بزنید.

تفاوت بین CurrentStepProgress و EstimatedTotalProgress چیست؟
CurrentStepProgress درصد تکمیل برای فاز فعلی بارگذاری است، مانند خواندن وظایف یا منابع. EstimatedTotalProgress درصد تخمین زده شده تکمیل برای کل عملیات است. هر دو عدد صحیح بین 0 تا 100 هستند.

آیا می‌توانم بارگیری را از داخل فراخوانی لغو کنم؟ نه، به‌صورت مستقیم از داخل Notify نمی‌توان. در عوض، LoadOptions.CancellationToken را به توکنی از یک CancellationTokenSource تنظیم کنید و Cancel() را روی آن منبع از یک رشتهٔ دیگر فراخوانی کنید. سپس سازندهٔ Project متوقف می‌شود و استثنا می‌اندازد، بنابراین آن را در try/catch بپیچید.

آیا افزودن یک callback باعث کند شدن بارگذاری می‌شود؟
هزینه‌ی اضافه شدن callback ناچیز است زیرا Notify در تعداد کمی از نقاط بررسی فراخوانی می‌شود، نه برای هر رکورد. با این حال، روش را سبک نگه دارید، زیرا هر کاری که داخل آن انجام می‌دهید بر روی رشته‌ی بارگذاری اجرا می‌شود.

بیشتر بخوانید