Velké soubory Microsoft Project MPP a Primavera XER mohou při parsování trvat od několika sekund až po několik minut. Během tohoto procesu vypadá naivní aplikace zamrzlá: žádná ukazatelka průběhu, žádný text stavu, nic, na co by uživatel mohl reagovat. Každý, kdo načítá velké plány, potřebuje způsob, jak zobrazit, jak daleko je načítání, a způsob, jak zastavit proces, který běží příliš dlouho.

Tento průvodce pokrývá oba případy s Aspose.Tasks for .NET. Vytvoříte zpětné volání pro sledování postupu, které bude hlásit aktuální fázi a procenta, zapojíte jej do načítání, udržíte desktopové uživatelské rozhraní responzivní, zatímco parsování běží na pozadí, a zrušíte načítání, které překročí časový rozpočet.

Klíčové poznatky

  • IProgressNotificationCallback.Notify(ProgressNotificationArgs) je jediná metoda, kterou implementujete pro získání informací o průběhu načítání z Aspose.Tasks for .NET.
  • ProgressNotificationArgs poskytuje CurrentStepName, CurrentStepProgress (0–100) a EstimatedTotalProgress (0–100).
  • Připojte zpětné volání pomocí LoadOptions.ProjectLoadingCallback; je podporováno pro formáty MPP a XER.
  • Notify běží na načítacím vlákně, takže před aktualizací ovládacího prvku převeďte hodnoty do UI vlákna.
  • Zrušte pomalé načítání nastavením LoadOptions.CancellationToken a voláním Cancel() na jeho CancellationTokenSource z jiného vlákna.
  • API pro průběh funguje v evaluačním režimu; licence pouze odstraňuje omezení velikosti souboru a výstupní limity.

Jste noví v knihovně? The Aspose.Tasks for .NET product page a dokumentace pokrývají nastavení a licencování v plném rozsahu.

Jak sledovat průběh načítání projektu v C#?

Implementujte IProgressNotificationCallback, nastavte jej na LoadOptions.ProjectLoadingCallback a načtěte soubor pomocí konstruktoru Project, který přijímá LoadOptions. Minimální funkční kód se skládá ze tří částí: třídy zpětného volání, instance LoadOptions a volání načtení.

  • Vstup: soubor MPP nebo XER, například BigProject.mpp
  • Výstup: aktualizace postupu během parsování — CurrentStepName, CurrentStepProgress, EstimatedTotalProgress
  • Knihovna: Aspose.Tasks for .NET
  • Jazyk: 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);
    }
}

Jakmile je soubor parsován, Notify se spustí několikrát a konzole zobrazuje fázi a procenta. Po návratu konstruktoru je objekt Project plně načten a použitelný.

Proč je sledování postupu načítání důležité u velkých souborů?

Nahrazuje neodpovídající, vypadající jako pauza, viditelnou odezvou, což je rozdíl mezi aplikací, která vypadá rozbité, a aplikací, která vypadá zaneprázdněně. Čím je soubor větší, tím déle trvá parsování a tím více vás neviditelné načtení stojí vnímanou kvalitou.

Konkrétní použití hodnot postupu:

  • Řiďte deterministický ukazatel postupu pomocí EstimatedTotalProgress místo zobrazování neomezeného spinneru.
  • Zaznamenávejte přechody CurrentStepName, abyste zjistili, která fáze dominuje době načítání při profilování pomalého souboru.
  • Udržujte UI responzivní načítáním na pozadí a odesíláním postupu do UI vlákna.
  • Zobrazte postup pro každý soubor v dávkovém nástroji, který převádí nebo migruje mnoho projektů po sobě.

Jak nainstalovat Aspose.Tasks a nastavit projekt?

Přidejte balíček Aspose.Tasks NuGet do projektu .NET 6 nebo novějšího.

dotnet add package Aspose.Tasks

Nebo z konzole Správce balíčků ve Visual Studio:

Install-Package Aspose.Tasks

Zpětné volání postupu funguje bez licence. Pokud potřebujete načíst soubory přesahující limit velikosti pro hodnocení nebo zpracovávat bez omezení hodnocení, nastavte licenci jednou při spuštění:

using Aspose.Tasks;

var license = new License();
license.SetLicense("Aspose.Tasks.lic");

Můžete požádat o bezplatnou dočasnou licenci na Aspose dočasná licenční stránka, a přečíst si více o knihovně na Aspose.Tasks for .NET produktová stránka.

Co poskytuje API IProgressNotificationCallback?

API je jedno rozhraní, jedna metoda a jeden typ argumentu, vše v namespace Aspose.Tasks.

MemberTypeDescription
IProgressNotificationCallback.Notify(ProgressNotificationArgs)voidVoláno během dlouhotrvajících operací projektu pro hlášení postupu.
ProgressNotificationArgs.CurrentStepNamestring (get)Název aktuální fáze operace.
ProgressNotificationArgs.CurrentStepProgressint (get)Odhadované procento dokončení aktuální fáze, 0–100.
ProgressNotificationArgs.EstimatedTotalProgressint (get)Odhadované procento dokončení celé operace, 0–100.
LoadOptions.ProjectLoadingCallbackIProgressNotificationCallback (get/set)Callback volaný během načítání. Podporováno pro MPP a XER.
LoadOptions.CancellationTokenSystem.Threading.CancellationToken (get/set)Token používaný ke zrušení probíhajícího načítání.

ProgressNotificationArgs je uzavřená třída a dědí z EventArgs. Všechny tři její vlastnosti jsou jen pro čtení.

Jak implementovat zpětné volání pro oznámení o průběhu?

Vytvořte třídu, která implementuje IProgressNotificationCallback, a udělejte něco užitečného s ProgressNotificationArgs uvnitř Notify. Udržujte metodu rychlou, protože běží na načítacím vláknu.

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);
    }
}

Ochrana na lastTotal zabraňuje zaplavení konzole duplicitními řádky, když několik volání Notify hlásí stejný celkový součet.

Jak načíst projekt se sledováním postupu?

Nastavte ProjectLoadingCallback na objekt LoadOptions a poté jej předávejte konstruktoru Project. Načítání probíhá synchronně; když konstruktor vrátí, je parsování dokončeno.

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;
    }
}

Zkoušíte to ve svém vlastním rozvrhu? Stáhněte si zdarma dočasnou licenci pro provádění zátěží bez omezení velikosti souboru v evaluační verzi.

Jak udržet uživatelské rozhraní responzivní během načítání?

Načtěte na vlákně na pozadí a přeneste hodnoty postupu do vlákna UI uvnitř zpětného volání, protože Notify běží na kterémkoli vlákně, které zavolalo konstruktor 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;
        }
    }
}

Ve WPF použijte Dispatcher.Invoke nebo Dispatcher.BeginInvoke místo Control.BeginInvoke.

Jak zrušit dlouho běžící načítání?

Nastavte LoadOptions.CancellationToken na token z CancellationTokenSource, poté zavolejte Cancel() na tento zdroj z jiného vlákna. Aspose.Tasks přestane parsovat a konstruktor Project vyhodí výjimku, takže jej obalte do 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);
}

Závěr

Přidání indikátoru načítání do aplikace Aspose.Tasks for .NET je malá změna s velkým vlivem na vnímanou odezvu. Implementujte IProgressNotificationCallback, přiřaďte jej k LoadOptions.ProjectLoadingCallback a v metodě Notify čtěte CurrentStepName, CurrentStepProgress a EstimatedTotalProgress. Přidejte CancellationToken, pokud může načítání trvat dostatečně dlouho, aby jej uživatel mohl chtít zastavit.

Prozkoumejte dokumentaci Aspose.Tasks for .NET a referenční API, abyste šli dál, a stáhněte si bezplatnou dočasnou licenci, abyste mohli hodnotit bez omezení.

FAQs

Potřebuji placenou licenci k použití API pro oznámení postupu? Ne. IProgressNotificationCallback funguje v evaluačním režimu. Dočasná nebo placená licence pouze odstraňuje evaluační limity na velikost souboru a výstup; neodemyká API pro sledování postupu.

Funguje stejný callback i pro soubory XER stejně jako pro MPP?
Ano. LoadOptions.ProjectLoadingCallback je v současné době podporován pro formáty MPP a XER. Stejná implementace IProgressNotificationCallback zpracovává oba.

Je zpětné volání postupu (progress callback) vlákno‑bezpečné?
Notify je voláno na vlákně, které provádí načítání, ne na vlákně na pozadí. V desktopové aplikaci převeďte hodnoty na UI vlákno pomocí Control.Invoke nebo Dispatcher.Invoke, než se dotknete ukazatele postupu.

Jaký je rozdíl mezi CurrentStepProgress a EstimatedTotalProgress?
CurrentStepProgress je procentuální dokončení aktuální fáze načítání, například čtení úkolů nebo čtení zdrojů. EstimatedTotalProgress je odhadované procentuální dokončení celé operace. Oba jsou celá čísla od 0 do 100.

Mohu zrušit načítání uvnitř callbacku? Ne přímo z uvnitř Notify. Místo toho nastavte LoadOptions.CancellationToken na token z CancellationTokenSource a zavolejte Cancel() na tomto zdroji z jiného vlákna. Konstruktor Project pak přestane a vyhodí výjimku, takže jej obalte do try/catch.

Způsobuje přidání callbacku zpomalení načítání?
Překrytí callbacku je zanedbatelné, protože Notify je voláno na malém počtu kontrolních bodů, ne pro každý záznam. Přesto udržujte metodu lehkou, protože jakákoli práce, kterou v ní provádíte, běží na načítacím vláknu.

Číst dál