대형 Microsoft Project MPP 및 Primavera XER 파일은 파싱하는 데 몇 초에서 몇 분까지 걸릴 수 있습니다. 파싱이 진행되는 동안, 단순한 애플리케이션은 멈춘 것처럼 보입니다: 진행 표시줄도 없고, 상태 텍스트도 없으며, 사용자가 조작할 수 있는 것이 없습니다. 큰 일정 파일을 로드하는 사람은 로드 진행 상황을 표시할 방법과 너무 오래 실행되는 작업을 중지할 방법이 필요합니다.
이 가이드는 Aspose.Tasks for .NET을 사용한 두 가지 경우를 모두 다룹니다. 현재 단계와 백분율을 보고하는 진행 콜백을 구축하고, 이를 로드에 연결하며, 파싱이 백그라운드 스레드에서 실행되는 동안 데스크톱 UI가 응답성을 유지하도록 하고, 시간 예산을 초과하는 로드를 취소하는 방법을 배웁니다.
핵심 요점
IProgressNotificationCallback.Notify(ProgressNotificationArgs)은(는) Aspose.Tasks for .NET에서 로드 진행 상황을 받기 위해 구현하는 단일 메서드입니다.ProgressNotificationArgs은(는)CurrentStepName,CurrentStepProgress(0–100),EstimatedTotalProgress(0–100)를 노출합니다.LoadOptions.ProjectLoadingCallback으로 콜백을 연결합니다; 이는 MPP 및 XER 형식을 지원합니다.Notify는 로드 스레드에서 실행되므로, 컨트롤을 업데이트하기 전에 값을 UI 스레드로 마샬링해야 합니다.- 다른 스레드에서
LoadOptions.CancellationToken을 설정하고 해당CancellationTokenSource의Cancel()을 호출하여 느린 로드를 취소합니다. - 진행 상황 API는 평가 모드에서 작동하며, 라이선스는 파일 크기 및 출력 제한만 제거합니다.
라이브러리를 처음 사용하시는 분이신가요? Aspose.Tasks for .NET 제품 페이지와 문서에서 설정 및 라이선스에 대해 전체적으로 다룹니다.
C#에서 프로젝트 로드 진행 상황을 모니터링하는 방법?
IProgressNotificationCallback을 구현하고, 이를 LoadOptions.ProjectLoadingCallback에 설정한 다음, LoadOptions를 받아들이는 Project 생성자를 통해 파일을 로드합니다. 최소 동작 코드는 세 부분으로 구성됩니다: 콜백 클래스, LoadOptions 인스턴스, 그리고 로드 호출.
- 입력: MPP 또는 XER 파일, 예를 들어
BigProject.mpp - 출력: 구문 분석 중 진행 상황 업데이트 —
CurrentStepName,CurrentStepProgress,EstimatedTotalProgress - 라이브러리: Aspose.Tasks for .NET
- 언어: 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전환을 로그에 기록합니다. - 백그라운드 스레드에서 로드하고 진행 상황을 UI 스레드에 전달하여 UI가 응답성을 유지하도록 합니다.
- 여러 프로젝트를 순차적으로 변환하거나 마이그레이션하는 배치 도구에서 파일별 진행 상황을 표시합니다.
Aspose.Tasks를 설치하고 프로젝트를 설정하는 방법은?
Aspose.Tasks NuGet 패키지를 .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 제품 페이지를 참조하십시오.
IProgressNotificationCallback API는 무엇을 제공합니까?
API는 하나의 인터페이스, 하나의 메서드, 그리고 하나의 인수 유형으로 구성되며, 모두 Aspose.Tasks 네임스페이스에 포함됩니다.
| 멤버 | 타입 | 설명 |
|---|---|---|
IProgressNotificationCallback.Notify(ProgressNotificationArgs) | void | 오래 실행되는 프로젝트 작업 중에 진행 상황을 보고하기 위해 호출됩니다. |
ProgressNotificationArgs.CurrentStepName | string (get) | 작업의 현재 단계 이름. |
ProgressNotificationArgs.CurrentStepProgress | int (get) | 현재 단계에 대한 추정 완료 비율(0–100). |
ProgressNotificationArgs.EstimatedTotalProgress | int (get) | 전체 작업에 대한 추정 완료 비율(0–100). |
LoadOptions.ProjectLoadingCallback | IProgressNotificationCallback (get/set) | 로드 중에 호출되는 콜백. MPP 및 XER를 지원합니다. |
LoadOptions.CancellationToken | System.Threading.CancellationToken (get/set) | 진행 중인 로드를 취소하는 데 사용되는 토큰. |
ProgressNotificationArgs는 sealed이며 EventArgs에서 파생됩니다. 세 개의 속성 모두 읽기 전용입니다.
진행 알림 콜백을 구현하는 방법은?
IProgressNotificationCallback을 구현하는 클래스를 만들고, Notify 내부에서 ProgressNotificationArgs를 활용하여 유용한 작업을 수행하십시오. 로딩 스레드에서 실행되므로 메서드를 빠르게 유지하세요.
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 참조를 확인하고, 제한 없이 평가하려면 무료 임시 라이선스를 다운로드하십시오.
FAQs
진행 알림 API를 사용하려면 유료 라이선스가 필요합니까?
아니요. IProgressNotificationCallback는 평가 모드에서 작동합니다. 임시 또는 유료 라이선스는 파일 크기 및 출력에 대한 평가 제한만 제거하며, 진행 API를 활성화하지는 않습니다.
XER 파일과 MPP 파일 모두에 동일한 콜백이 작동합니까?
예. LoadOptions.ProjectLoadingCallback은 현재 MPP 및 XER 형식에서 지원됩니다. 동일한 IProgressNotificationCallback 구현이 두 경우 모두 처리합니다.
진행 콜백은 스레드 안전합니까?
Notify는 로드를 실행하는 스레드에서 호출되며, 백그라운드 스레드에서 호출되지 않습니다. 데스크톱 앱에서는 진행 표시줄에 접근하기 전에 Control.Invoke 또는 Dispatcher.Invoke를 사용하여 값을 UI 스레드로 마샬링하십시오.
CurrentStepProgress와 EstimatedTotalProgress의 차이점은 무엇인가요?
CurrentStepProgress는 작업 읽기 또는 리소스 읽기와 같은 로드의 현재 단계에 대한 완료 비율입니다. EstimatedTotalProgress는 전체 작업에 대한 추정 완료 비율입니다. 두 값 모두 0에서 100 사이의 정수입니다.
콜백 내부에서 로드를 취소할 수 있나요?Notify 내부에서 직접 취소할 수는 없습니다. 대신 LoadOptions.CancellationToken을 CancellationTokenSource에서 가져온 토큰으로 설정하고, 다른 스레드에서 해당 소스의 Cancel()을 호출합니다. 그러면 Project 생성자가 중단되고 예외를 발생하므로 try/catch로 감싸세요.
콜백을 추가하면 로딩이 느려지나요?
콜백 오버헤드는 Notify가 레코드당이 아니라 소수의 체크포인트에서 호출되기 때문에 무시할 수 있습니다. 그러나 메서드는 가볍게 유지하세요. 내부에서 수행하는 모든 작업은 로딩 스레드에서 실행되기 때문입니다.
