Büyük Microsoft Project MPP ve Primavera XER dosyaları ayrıştırılması birkaç saniyeden birkaç dakikaya kadar sürebilir. Bu süreçte, basit bir uygulama donmuş gibi görünür: ilerleme çubuğu yok, durum metni yok, kullanıcının harekete geçebileceği bir şey yok. Büyük takvimleri yükleyen herkes, yüklemenin ne kadar ilerlediğini gösteren bir yol ve çok uzun süren bir yüklemeyi durdurma yoluna ihtiyaç duyar.

Bu kılavuz, Aspose.Tasks for .NET ile her ikisini de kapsar. Mevcut aşamayı ve yüzdeyi raporlayan bir ilerleme geri araması oluşturacak, bunu yükleme sürecine bağlayacak, ayrıştırma arka plan iş parçacığında çalışırken masaüstü UI’sinin yanıt vermesini sağlayacak ve zaman bütçesini aşan bir yüklemeyi iptal edeceksiniz.

Anahtar Çıkarımlar

  • IProgressNotificationCallback.Notify(ProgressNotificationArgs) Aspose.Tasks for .NET’ten yükleme ilerlemesini almak için uyguladığınız tek yöntemdir.
  • ProgressNotificationArgs CurrentStepName, CurrentStepProgress (0–100) ve EstimatedTotalProgress (0–100) özelliklerini sunar.
  • Geri aramayı LoadOptions.ProjectLoadingCallback ile ekleyin; MPP ve XER formatları için desteklenir.
  • Notify yükleme iş parçacığında çalışır, bu yüzden bir kontrolü güncellemeden önce değerleri UI iş parçacığına aktarın.
  • Başka bir iş parçacığından LoadOptions.CancellationToken ayarlayarak ve onun CancellationTokenSource üzerindeki Cancel() metodunu çağırarak yavaş bir yüklemeyi iptal edin.
  • İlerleme API’si değerlendirme modunda çalışır; bir lisans yalnızca dosya boyutu ve çıktı limitlerini kaldırır.

Kütüphaneye yeni misiniz? Aspose.Tasks for .NET ürün sayfası ve belgeler kurulum ve lisanslamayı tam olarak kapsar.

C#‘de Proje Yükleme İlerlemesini Nasıl İzlersiniz?

Implement IProgressNotificationCallback‘i uygulayın, LoadOptions.ProjectLoadingCallback üzerine ayarlayın ve LoadOptions kabul eden Project yapıcı üzerinden dosyayı yükleyin. Minimum çalışan kod üç bölümden oluşur: bir geri çağırma sınıfı, bir LoadOptions örneği ve yükleme çağrısı.

  • Input: bir MPP veya XER dosyası, örneğin BigProject.mpp
  • Output: ayrıştırma sırasında ilerleme güncellemeleri — 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);
    }
}

Dosya ayrıştırıldıkça, Notify birkaç kez çalışır ve konsol aşamayı ve yüzde değerlerini gösterir. Yapıcı döndükten sonra, Project nesnesi tamamen yüklenir ve kullanılabilir.

Büyük Dosyalar İçin Yükleme İlerleme İzlemesi Neden Önemlidir?

Yanıt vermeyen bir duraklamayı görünür geri bildirimle değiştirir; bu, bozuk görünen bir uygulama ile meşgul görünen bir uygulama arasındaki farktır. Dosya ne kadar büyükse, ayrıştırma o kadar uzun sürer ve kör bir yükleme, algılanan kalite açısından o kadar pahalıya mal olur.

İlerleme değerleri için somut kullanım örnekleri:

  • Belirsiz bir döndürme göstergesi yerine EstimatedTotalProgress ile belirli bir ilerleme çubuğu yönetin.
  • Yavaş bir dosyayı profil oluştururken hangi aşamanın yük süresini hâkim olduğunu bulmak için CurrentStepName geçişlerini kaydedin.
  • Arka plan iş parçacığında yükleme yaparak ve ilerlemeyi UI iş parçacığına göndererek UI’nın yanıt vermesini sağlayın.
  • Birçok projeyi sırasıyla dönüştüren veya taşıyan toplu bir araçta dosya başına ilerlemeyi gösterin.

Aspose.Tasks Nasıl Yüklenir ve Proje Nasıl Kurulur?

Aspose.Tasks NuGet paketini .NET 6 veya daha sonraki bir projeye ekleyin.

dotnet add package Aspose.Tasks

Veya, Visual Studio Paket Yöneticisi Konsolundan:

Install-Package Aspose.Tasks

İlerleme geri çağrısı lisans olmadan çalışır. Değerlendirme boyut sınırının üzerindeki dosyaları yüklemeniz veya değerlendirme kısıtlamaları olmadan işlem yapmanız gerekiyorsa, başlangıçta bir kez lisans ayarlayın:

using Aspose.Tasks;

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

Ücretsiz bir geçici lisansı Aspose geçici lisans sayfasından isteyebilir ve kütüphane hakkında daha fazla bilgiyi Aspose.Tasks for .NET ürün sayfasında okuyabilirsiniz.

IProgressNotificationCallback API’si ne sağlar?

API, tek bir arayüz, tek bir yöntem ve tek bir argüman türünden oluşur; hepsi Aspose.Tasks ad alanında bulunur.

ÜyeTürAçıklama
IProgressNotificationCallback.Notify(ProgressNotificationArgs)voidUzun süren proje işlemleri sırasında ilerlemeyi raporlamak için çağrılır.
ProgressNotificationArgs.CurrentStepNamestring (get)İşlemin mevcut aşamasının adı.
ProgressNotificationArgs.CurrentStepProgressint (get)Mevcut aşama için tahmini yüzde tamamlanma, 0–100.
ProgressNotificationArgs.EstimatedTotalProgressint (get)Tüm işlem için tahmini yüzde tamamlanma, 0–100.
LoadOptions.ProjectLoadingCallbackIProgressNotificationCallback (get/set)Yükleme sırasında çağrılan geri bildirim. MPP ve XER için desteklenir.
LoadOptions.CancellationTokenSystem.Threading.CancellationToken (get/set)Devam eden bir yüklemeyi iptal etmek için kullanılan belirteç.

ProgressNotificationArgs bir sealed sınıftır ve EventArgs sınıfından türetilir. Üç özelliği de yalnızca okunabilir.

İlerleme Bildirimi Geri Çağrısını Nasıl Uygularsınız?

IProgressNotificationCallback arayüzünü uygulayan bir sınıf oluşturun ve Notify içinde ProgressNotificationArgs ile faydalı bir şey yapın. Yöntemi hızlı tutun, çünkü yükleme iş parçacığında çalışıyor.

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 üzerindeki koruma, birkaç Notify çağrısı aynı toplamı rapor ettiğinde konsolda yinelenen satırların doldurulmasını önler.

İlerleme Takibiyle Bir Projeyi Nasıl Yüklersiniz?

ProjectLoadingCallback‘i bir LoadOptions nesnesinde ayarlayın, ardından bunu Project yapıcısına geçirin. Yükleme senkron olarak çalışır; yapıcı döndüğünde ayrıştırma tamamlanır.

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

Bunu kendi takvimlerinizde mi deniyorsunuz? Ücretsiz geçici bir lisans indirin dosya boyutu üzerindeki değerlendirme limitine takılmadan yükleri çalıştırmak için.

Yükleme Sırasında UI’yi Nasıl Yanıt Verir Tutarsınız?

Arka plan iş parçacığında yükleyin ve geri arama içinde ilerleme değerlerini UI iş parçacığına yönlendirin, çünkü Notify, Project yapıcısını çağıran iş parçacığında çalışır.

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’de, Control.BeginInvoke yerine Dispatcher.Invoke veya Dispatcher.BeginInvoke kullanın.

Uzun Süreli Yüklemeyi Nasıl İptal Edersiniz?

Set LoadOptions.CancellationToken özelliğini bir CancellationTokenSource‘tan alınan token’a ayarlayın, ardından başka bir iş parçacığından o kaynağa Cancel() çağrısı yapın. Aspose.Tasks ayrıştırmayı durdurur ve Project yapıcı istisna fırlatır, bu yüzden try/catch içinde sarın.

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

Sonuç

Aspose.Tasks for .NET uygulamasına yük ilerlemesi eklemek, algılanan yanıt verebilirlik üzerinde büyük etki yaratan küçük bir değişikliktir. IProgressNotificationCallback‘i uygulayın, onu LoadOptions.ProjectLoadingCallback‘e atayın ve Notify içinde CurrentStepName, CurrentStepProgress ve EstimatedTotalProgress değerlerini okuyun. Yüklemeler yeterince uzun sürebileceği ve kullanıcının durdurmak isteyebileceği durumlarda bir CancellationToken ekleyin.

Aspose.Tasks for .NET belgeleri keşfedin ve daha ileri gitmek için API referansına bakın, ve sınırsız değerlendirme için ücretsiz geçici bir lisans indirin.

FAQs

İlerleme bildirim API’sini kullanmak için ücretli bir lisansa ihtiyacım var mı?
Hayır. IProgressNotificationCallback değerlendirme modunda çalışır. Geçici veya ücretli bir lisans yalnızca dosya boyutu ve çıktı üzerindeki değerlendirme sınırlamalarını kaldırır; ilerleme API’sini açmaz.

Aynı geri arama XER dosyaları için de MPP gibi çalışıyor mu?
Evet. LoadOptions.ProjectLoadingCallback şu anda MPP ve XER formatları için desteklenmektedir. Aynı IProgressNotificationCallback uygulaması her ikisini de işler.

İlerleme geri çağrısı iş parçacığı güvenli mi? Notify yüklemeyi çalıştıran iş parçacığında, arka plan iş parçacığında değil, çağrılır. Bir masaüstü uygulamasında, bir ilerleme çubuğuna dokunmadan önce değerleri Control.Invoke veya Dispatcher.Invoke ile UI iş parçacığına yönlendirin.

CurrentStepProgress ve EstimatedTotalProgress arasındaki fark nedir? CurrentStepProgress yüklemenin mevcut aşaması için yüzde tamamlanma oranıdır, örneğin görevleri okuma veya kaynakları okuma gibi. EstimatedTotalProgress ise tüm işlem için tahmini yüzde tamamlanma oranıdır. Her ikisi de 0 ile 100 arasında tam sayılardır.

Callback içinde bir yüklemeyi iptal edebilir miyim?
Notify içinde doğrudan iptal edilemez. Bunun yerine, LoadOptions.CancellationToken özelliğini bir CancellationTokenSource‘dan alınan token’a ayarlayın ve o kaynağı başka bir iş parçacığından Cancel() çağrısı yaparak iptal edin. Project yapıcı daha sonra durur ve bir istisna fırlatır, bu yüzden try/catch içinde sarmalayın.

Bir geri arama eklemek yüklemeyi yavaşlatır mı? Geri arama ek yükü ihmal edilebilir düzeydedir çünkü Notify az sayıda kontrol noktasında çağrılır, kayıt başına değil. Yöntemi hafif tutun, çünkü içinde yaptığınız herhangi bir iş yükleme iş parçacığında çalışır.

Devamını Oku