diff --git a/Nuclex.Support (x86).csproj b/Nuclex.Support (x86).csproj index dbee5ed..a8b4444 100644 --- a/Nuclex.Support (x86).csproj +++ b/Nuclex.Support (x86).csproj @@ -148,7 +148,7 @@ - + diff --git a/Source/Scheduling/Operation.cs b/Source/Scheduling/Operation.cs index ceaadac..850769b 100644 --- a/Source/Scheduling/Operation.cs +++ b/Source/Scheduling/Operation.cs @@ -26,7 +26,7 @@ using Nuclex.Support.Tracking; namespace Nuclex.Support.Scheduling { /// Base class for observable operations running in the background - public abstract class Operation : FailableProgression { + public abstract class Operation : Request { /// Launches the background operation public abstract void Start(); diff --git a/Source/Tracking/Internal/ObservedWeightedProgression.cs b/Source/Tracking/Internal/ObservedWeightedProgression.cs index 4079ac7..d454d4a 100644 --- a/Source/Tracking/Internal/ObservedWeightedProgression.cs +++ b/Source/Tracking/Internal/ObservedWeightedProgression.cs @@ -48,6 +48,7 @@ namespace Nuclex.Support.Tracking { ) { this.weightedProgression = weightedProgression; + // See if this progression has already ended (initial check for performance) if(weightedProgression.Progression.Ended) { this.progress = 1.0f; @@ -60,8 +61,17 @@ namespace Nuclex.Support.Tracking { this.weightedProgression.Progression.AsyncEnded += new EventHandler(asyncEnded); - this.weightedProgression.Progression.AsyncProgressUpdated += - new EventHandler(asyncProgressUpdated); + // Check whether this progression might have ended before we were able to + // attach ourselfes to its event. If so, don't bother registering to the + // other event and (important) set our progress to 1.0 because, since we + // might not have gotten the 'Ended' event, it might otherwise stay at 0.0 + // even though the progression is in the 'Ended' state. + if(weightedProgression.Progression.Ended) { + this.progress = 1.0f; + } else { + this.weightedProgression.Progression.AsyncProgressUpdated += + new EventHandler(asyncProgressUpdated); + } } } diff --git a/Source/Tracking/FailableProgression.cs b/Source/Tracking/Request.cs similarity index 67% rename from Source/Tracking/FailableProgression.cs rename to Source/Tracking/Request.cs index 720b818..154eb4d 100644 --- a/Source/Tracking/FailableProgression.cs +++ b/Source/Tracking/Request.cs @@ -1,3 +1,23 @@ +#region CPL License +/* +Nuclex Framework +Copyright (C) 2002-2008 Nuclex Development Labs + +This library is free software; you can redistribute it and/or +modify it under the terms of the IBM Common Public License as +published by the IBM Corporation; either version 1.0 of the +License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +IBM Common Public License for more details. + +You should have received a copy of the IBM Common Public +License along with this library +*/ +#endregion + using System; using System.Collections.Generic; @@ -17,17 +37,17 @@ namespace Nuclex.Support.Tracking { /// OnAsyncEnded(), no matter what the outcome of your background operation is. /// /// - public class FailableProgression : Progression { + public class Request : Progression { - #region class EndedDummyProgression + #region class EndedDummyRequest - /// Dummy progression that is always in the ended state - private class EndedDummyProgression : FailableProgression { - /// Creates a new successfully completed dummy progression - public EndedDummyProgression() : this(null) { } - /// Creates a new failed dummy progression + /// Dummy request that is always in the ended state + private class EndedDummyRequest : Request { + /// Creates a new successfully completed dummy request + public EndedDummyRequest() : this(null) { } + /// Creates a new failed dummy request /// Exception that caused the dummy to fail - public EndedDummyProgression(Exception exception) { + public EndedDummyRequest(Exception exception) { OnAsyncEnded(); // Only call SetException() if an actual exception was provided. Who knows what @@ -37,17 +57,17 @@ namespace Nuclex.Support.Tracking { } } - #endregion // EndedDummyProgression + #endregion // EndedDummyRequest - /// Creates a new failed dummy progression + /// Creates a new failed dummy request /// /// Exception that supposedly caused the progression to fail /// /// - /// A failed progression that reports the provided exception as cause for its failure + /// A failed request that reports the provided exception as cause for its failure /// - public static FailableProgression CreateFailedDummyProgression(Exception exception) { - return new EndedDummyProgression(exception); + public static Request CreateFailedDummyRequest(Exception exception) { + return new EndedDummyRequest(exception); } /// Waits for the background operation to end @@ -59,14 +79,6 @@ namespace Nuclex.Support.Tracking { /// public virtual void Join() { - // By design, end can only be called once! - lock(this) { - if(this.endCalled) - throw new InvalidOperationException("End() has already been called"); - - this.endCalled = true; - } - // If the progression itself hasn't ended yet, block the caller until it has. if(!Ended) WaitHandle.WaitOne(); @@ -101,8 +113,6 @@ namespace Nuclex.Support.Tracking { /// Exception that occured while the operation was executing private volatile Exception occuredException; - /// Whether the End() method has been called already - private volatile bool endCalled; }