diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/ref/System.Diagnostics.DiagnosticSourceActivity.cs b/src/libraries/System.Diagnostics.DiagnosticSource/ref/System.Diagnostics.DiagnosticSourceActivity.cs
index fd218a7dbf9df1..f82cadcde38e11 100644
--- a/src/libraries/System.Diagnostics.DiagnosticSource/ref/System.Diagnostics.DiagnosticSourceActivity.cs
+++ b/src/libraries/System.Diagnostics.DiagnosticSource/ref/System.Diagnostics.DiagnosticSourceActivity.cs
@@ -25,6 +25,7 @@ public string? Id
}
public bool IsAllDataRequested { get { throw null; } set { throw null; } }
+ public bool IsStopped { get { throw null; } }
public System.Diagnostics.ActivityIdFormat IdFormat { get { throw null; } }
public System.Diagnostics.ActivityKind Kind { get { throw null; } }
public string OperationName { get { throw null; } }
diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs
index 72c8a20bb77453..1bffa9b98f07bf 100644
--- a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs
+++ b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs
@@ -684,9 +684,9 @@ public void Stop()
return;
}
- if (!IsFinished)
+ if (!IsStopped)
{
- IsFinished = true;
+ IsStopped = true;
if (Duration == TimeSpan.Zero)
{
@@ -951,7 +951,7 @@ internal static bool TryConvertIdToContext(string traceParent, string? traceStat
///
public void Dispose()
{
- if (!IsFinished)
+ if (!IsStopped)
{
Stop();
}
@@ -1232,7 +1232,7 @@ private static unsafe long GetRandomNumber()
private static bool ValidateSetCurrent(Activity? activity)
{
- bool canSet = activity == null || (activity.Id != null && !activity.IsFinished);
+ bool canSet = activity == null || (activity.Id != null && !activity.IsStopped);
if (!canSet)
{
NotifyError(new InvalidOperationException(SR.ActivityNotRunning));
@@ -1298,18 +1298,24 @@ private bool W3CIdFlagsSet
get => (_w3CIdFlags & ActivityTraceFlagsIsSet) != 0;
}
- private bool IsFinished
+ ///
+ /// Indicates whether this object is stopped
+ ///
+ ///
+ /// When subscribing to stop event using , the received object in the event callback will have as true.
+ ///
+ public bool IsStopped
{
- get => (_state & State.IsFinished) != 0;
- set
+ get => (_state & State.IsStopped) != 0;
+ private set
{
if (value)
{
- _state |= State.IsFinished;
+ _state |= State.IsStopped;
}
else
{
- _state &= ~State.IsFinished;
+ _state &= ~State.IsStopped;
}
}
}
@@ -1623,7 +1629,7 @@ private enum State : byte
FormatW3C = 0b_0_00000_10,
FormatFlags = 0b_0_00000_11,
- IsFinished = 0b_1_00000_00,
+ IsStopped = 0b_1_00000_00,
}
}
diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/tests/ActivityTests.cs b/src/libraries/System.Diagnostics.DiagnosticSource/tests/ActivityTests.cs
index 2ac5efa2d9fad5..6b2a0c8aecf5ec 100644
--- a/src/libraries/System.Diagnostics.DiagnosticSource/tests/ActivityTests.cs
+++ b/src/libraries/System.Diagnostics.DiagnosticSource/tests/ActivityTests.cs
@@ -299,7 +299,6 @@ public void ActivityIdOverflow()
Assert.Equal('#', activity.Id[activity.Id.Length - 1]);
}
-
///
/// Tests activity start and stop
/// Checks Activity.Current correctness, Id generation
@@ -320,6 +319,51 @@ public void StartStop()
Assert.Null(Activity.Current);
}
+ ///
+ /// Tests Activity.IsStopped
+ ///
+ [Fact]
+ public void IsStoppedTest()
+ {
+ using var activity = new Activity("activity");
+ Assert.False(activity.IsStopped);
+ activity.Start();
+ Assert.False(activity.IsStopped);
+ Assert.Equal(TimeSpan.Zero, activity.Duration);
+ activity.Stop();
+ Assert.NotEqual(TimeSpan.Zero, activity.Duration);
+ Assert.True(activity.IsStopped);
+
+ using var activity1 = new Activity("activity");
+ Assert.False(activity1.IsStopped);
+ activity1.Start();
+ Assert.False(activity1.IsStopped);
+ activity1.SetEndTime(DateTime.UtcNow.AddMinutes(1)); // Setting end time shouldn't mark the activity as stopped
+ Assert.False(activity1.IsStopped);
+ activity1.Stop();
+ Assert.True(activity1.IsStopped);
+
+ //
+ // Validate when receiving Start/Stop Activity events
+ //
+
+ using ActivitySource aSource = new ActivitySource("TestActivityIsStopped");
+ using ActivityListener listener = new ActivityListener();
+
+ listener.ShouldListenTo = (activitySource) => activitySource.Name == "TestActivityIsStopped";
+ listener.Sample = (ref ActivityCreationOptions activityOptions) => ActivitySamplingResult.AllData;
+ listener.ActivityStarted = a => Assert.False(a.IsStopped);
+ listener.ActivityStopped = a => Assert.True(a.IsStopped);
+ ActivitySource.AddActivityListener(listener);
+ Activity sourceActivity;
+ using (sourceActivity = aSource.StartActivity("a1"))
+ {
+ Assert.NotNull(sourceActivity);
+ Assert.False(sourceActivity.IsStopped);
+ }
+ Assert.True(sourceActivity.IsStopped);
+ }
+
///
/// Tests Id generation
///