File Microsoft Project MPP dan Primavera XER yang besar dapat memerlukan waktu mulai dari beberapa detik hingga beberapa menit untuk diproses. Selama proses tersebut berlangsung, aplikasi yang sederhana tampak membeku: tidak ada bilah kemajuan, tidak ada teks status, tidak ada yang dapat dilakukan pengguna. Siapa pun yang memuat jadwal besar membutuhkan cara untuk menunjukkan seberapa jauh proses pemuatan telah berjalan, dan cara untuk menghentikannya jika memakan waktu terlalu lama.

Panduan ini mencakup keduanya dengan Aspose.Tasks for .NET. Anda akan membuat callback kemajuan yang melaporkan fase saat ini dan persentase, menghubungkannya ke proses pemuatan, menjaga UI desktop tetap responsif sementara parsing berjalan pada thread latar belakang, dan membatalkan pemuatan yang melebihi batas waktu.

Poin Penting

  • IProgressNotificationCallback.Notify(ProgressNotificationArgs) adalah satu-satunya metode yang Anda implementasikan untuk menerima progres pemuatan dari Aspose.Tasks for .NET.
  • ProgressNotificationArgs menampilkan CurrentStepName, CurrentStepProgress (0–100), dan EstimatedTotalProgress (0–100).
  • Lampirkan callback dengan LoadOptions.ProjectLoadingCallback; ini didukung untuk format MPP dan XER.
  • Notify berjalan pada thread pemuatan, jadi pindahkan nilai ke thread UI sebelum memperbarui kontrol.
  • Batalkan pemuatan yang lambat dengan mengatur LoadOptions.CancellationToken dan memanggil Cancel() pada CancellationTokenSource‑nya dari thread lain.
  • API progres berfungsi dalam mode evaluasi; lisensi hanya menghapus batas ukuran file dan output.

Baru mengenal perpustakaan? Halaman produk Aspose.Tasks for .NET dan dokumentasi mencakup pengaturan dan lisensi secara lengkap.

Cara Memantau Progres Pemuatan Proyek di C#?

Implement IProgressNotificationCallback, tetapkan pada LoadOptions.ProjectLoadingCallback, dan muat file melalui konstruktor Project yang menerima LoadOptions. Kode kerja minimum terdiri dari tiga bagian: kelas callback, instance LoadOptions, dan panggilan load.

  • Input: sebuah file MPP atau XER, misalnya BigProject.mpp
  • Output: pembaruan kemajuan selama parsing — 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);
    }
}

Saat file diparsing, Notify dijalankan beberapa kali dan konsol menampilkan fase serta persentasenya. Setelah konstruktor mengembalikan nilai, objek Project sepenuhnya dimuat dan dapat digunakan.

Mengapa Pemantauan Progres Muat Penting untuk File Besar?

Ini menggantikan jeda yang tampak tidak responsif dengan umpan balik yang terlihat, yang merupakan perbedaan antara aplikasi yang tampak rusak dan yang tampak sibuk. Semakin besar file, semakin lama proses parsing, dan semakin besar beban buta yang mengurangi kualitas yang dirasakan.

Penggunaan konkret untuk nilai kemajuan:

  • Kendalikan progress bar deterministik dari EstimatedTotalProgress alih-alih menampilkan spinner tak terbatas.
  • Catat transisi CurrentStepName untuk menemukan fase mana yang mendominasi waktu pemuatan saat Anda memprofil file yang lambat.
  • Jaga UI tetap responsif dengan memuat pada thread latar belakang dan mengirimkan progres ke thread UI.
  • Tampilkan progres per file dalam alat batch yang mengonversi atau memigrasi banyak proyek secara berurutan.

Bagaimana Cara Menginstal Aspose.Tasks dan Menyiapkan Proyek?

Tambahkan paket NuGet Aspose.Tasks ke proyek .NET 6 atau yang lebih baru.

dotnet add package Aspose.Tasks

Atau, dari Konsol Manajer Paket Visual Studio:

Install-Package Aspose.Tasks

Callback kemajuan berfungsi tanpa lisensi. Jika Anda perlu memuat file di atas batas ukuran evaluasi atau memproses tanpa batasan evaluasi, tetapkan lisensi sekali saat startup:

using Aspose.Tasks;

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

Anda dapat meminta lisensi sementara gratis dari halaman lisensi sementara Aspose, dan membaca lebih lanjut tentang perpustakaan ini di halaman produk Aspose.Tasks for .NET.

Apa yang disediakan oleh API IProgressNotificationCallback?

API adalah satu antarmuka, satu metode, dan satu tipe argumen, semuanya berada di namespace Aspose.Tasks.

AnggotaTipeDeskripsi
IProgressNotificationCallback.Notify(ProgressNotificationArgs)voidDipanggil selama operasi proyek yang memakan waktu lama untuk melaporkan kemajuan.
ProgressNotificationArgs.CurrentStepNamestring (get)Nama fase saat ini dari operasi.
ProgressNotificationArgs.CurrentStepProgressint (get)Persentase perkiraan selesai untuk fase saat ini, 0–100.
ProgressNotificationArgs.EstimatedTotalProgressint (get)Persentase perkiraan selesai untuk seluruh operasi, 0–100.
LoadOptions.ProjectLoadingCallbackIProgressNotificationCallback (get/set)Callback yang dipanggil selama pemuatan. Didukung untuk MPP dan XER.
LoadOptions.CancellationTokenSystem.Threading.CancellationToken (get/set)Token yang digunakan untuk membatalkan proses pemuatan yang sedang berlangsung.

ProgressNotificationArgs adalah sealed dan diturunkan dari EventArgs. Semua tiga propertinya bersifat read-only.

Bagaimana Cara Mengimplementasikan Callback Notifikasi Progres?

Buat sebuah kelas yang mengimplementasikan IProgressNotificationCallback dan lakukan sesuatu yang berguna dengan ProgressNotificationArgs di dalam Notify. Jaga metode tetap cepat, karena dijalankan pada thread pemuatan.

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

Pengaman pada lastTotal mencegah konsol dibanjiri baris duplikat ketika beberapa pemanggilan Notify melaporkan total yang sama.

Bagaimana Cara Memuat Proyek dengan Pelacakan Progres?

Set ProjectLoadingCallback pada objek LoadOptions, lalu berikan ke konstruktor Project. Proses pemuatan berjalan secara sinkron; ketika konstruktor mengembalikan, parsing selesai.

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

Mencoba ini pada jadwal Anda sendiri? Unduh lisensi sementara gratis untuk menjalankan beban tanpa batas evaluasi pada ukuran file.

Bagaimana Cara Menjaga UI Tetap Responsif Saat Memuat?

Muat pada thread latar belakang dan marshalkan nilai kemajuan ke thread UI di dalam callback, karena Notify berjalan pada thread mana pun yang memanggil 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;
        }
    }
}

Di WPF, gunakan Dispatcher.Invoke atau Dispatcher.BeginInvoke sebagai pengganti Control.BeginInvoke.

Bagaimana Anda Membatalkan Muatan yang Berjalan Lama?

Set LoadOptions.CancellationToken ke token dari CancellationTokenSource, lalu panggil Cancel() pada sumber tersebut dari thread lain. Aspose.Tasks menghentikan parsing dan konstruktor Project melempar, jadi bungkus dalam 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);
}

Kesimpulan

Menambahkan progres pemuatan ke aplikasi Aspose.Tasks for .NET adalah perubahan kecil dengan efek besar pada responsivitas yang dirasakan. Implementasikan IProgressNotificationCallback, tetapkan ke LoadOptions.ProjectLoadingCallback, dan baca CurrentStepName, CurrentStepProgress, serta EstimatedTotalProgress di dalam Notify. Tambahkan CancellationToken ketika proses pemuatan dapat berjalan cukup lama sehingga pengguna mungkin ingin menghentikannya.

Jelajahi dokumentasi Aspose.Tasks for .NET dan referensi API untuk melangkah lebih jauh, serta unduh lisensi sementara gratis untuk mengevaluasi tanpa batas.

FAQs

Apakah saya memerlukan lisensi berbayar untuk menggunakan API notifikasi kemajuan? Tidak. IProgressNotificationCallback berfungsi dalam mode evaluasi. Lisensi sementara atau berbayar hanya menghapus batas evaluasi pada ukuran file dan output; itu tidak membuka kunci API kemajuan.

Apakah callback yang sama berfungsi untuk file XER serta MPP?
Ya. LoadOptions.ProjectLoadingCallback saat ini didukung untuk format MPP dan XER. Implementasi IProgressNotificationCallback yang sama menangani keduanya.

Apakah callback kemajuan thread‑safe?
Notify dipanggil pada thread yang menjalankan proses pemuatan, bukan thread latar belakang. Pada aplikasi desktop, alihkan nilai‑nilai ke thread UI dengan Control.Invoke atau Dispatcher.Invoke sebelum menyentuh progress bar.

Apa perbedaan antara CurrentStepProgress dan EstimatedTotalProgress?
CurrentStepProgress adalah persentase selesai untuk fase saat ini dari proses pemuatan, seperti membaca tugas atau membaca sumber daya. EstimatedTotalProgress adalah persentase selesai yang diperkirakan untuk seluruh operasi. Keduanya adalah bilangan bulat dari 0 hingga 100.

Apakah saya dapat membatalkan pemuatan dari dalam callback?
Tidak dapat dari dalam Notify secara langsung. Sebagai gantinya, atur LoadOptions.CancellationToken ke token dari CancellationTokenSource dan panggil Cancel() pada sumber tersebut dari thread lain. Konstruktor Project kemudian berhenti dan melempar pengecualian, jadi bungkus dengan try/catch.

Apakah menambahkan callback memperlambat pemuatan?
Overhead callback dapat diabaikan karena Notify dipanggil pada sejumlah kecil checkpoint, bukan per record. Tetap jaga metode tetap ringan, karena pekerjaan apa pun yang Anda lakukan di dalamnya dijalankan pada thread pemuatan.

Baca Selengkapnya