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.ProgressNotificationArgsposkytujeCurrentStepName,CurrentStepProgress(0–100) aEstimatedTotalProgress(0–100).- Připojte zpětné volání pomocí
LoadOptions.ProjectLoadingCallback; je podporováno pro formáty MPP a XER. Notifyběží 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.CancellationTokena volánímCancel()na jehoCancellationTokenSourcez 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í
EstimatedTotalProgressmí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.
| Member | Type | Description |
|---|---|---|
IProgressNotificationCallback.Notify(ProgressNotificationArgs) | void | Voláno během dlouhotrvajících operací projektu pro hlášení postupu. |
ProgressNotificationArgs.CurrentStepName | string (get) | Název aktuální fáze operace. |
ProgressNotificationArgs.CurrentStepProgress | int (get) | Odhadované procento dokončení aktuální fáze, 0–100. |
ProgressNotificationArgs.EstimatedTotalProgress | int (get) | Odhadované procento dokončení celé operace, 0–100. |
LoadOptions.ProjectLoadingCallback | IProgressNotificationCallback (get/set) | Callback volaný během načítání. Podporováno pro MPP a XER. |
LoadOptions.CancellationToken | System.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.
