diff --git a/docs/release-notes/.FSharp.Core/10.0.300.md b/docs/release-notes/.FSharp.Core/10.0.300.md
index 63321c19617..6904303cc37 100644
--- a/docs/release-notes/.FSharp.Core/10.0.300.md
+++ b/docs/release-notes/.FSharp.Core/10.0.300.md
@@ -8,6 +8,7 @@
 * Fix EvaluateQuotation to handle Sequential expressions, void method calls (unit return), and other patterns that were previously throwing NotSupportedException. Also properly handles unit-returning expressions by using Action delegates instead of Func delegates. ([Issue #19099](https://github.com/dotnet/fsharp/issues/19099))
 * Fix query conditionals without else branch (if-then only) that were causing type mismatch errors. Now properly extracts element type from IQueryable for creating empty sequences. ([Issue #3445](https://github.com/dotnet/fsharp/issues/3445))
 * Fix `Seq.empty` rendering as `"EmptyEnumerable"` in serializers by delegating to `System.Linq.Enumerable.Empty<'T>()` instead of using a custom DU type. ([Issue #17864](https://github.com/dotnet/fsharp/issues/17864), [PR #19317](https://github.com/dotnet/fsharp/pull/19317))
+* Fix `seq { try/with }` handler body executing twice when source throws immediately and handler yields nothing. ([Issue #19660](https://github.com/dotnet/fsharp/issues/19660), [PR #19661](https://github.com/dotnet/fsharp/pull/19661))
 * Ensure culture-independent parsing of .NET-style interpolated string holes. ([Issue #19367](https://github.com/dotnet/fsharp/issues/19367), [PR #19370](https://github.com/dotnet/fsharp/pull/19370))
 
 ### Added
diff --git a/src/FSharp.Core/seqcore.fs b/src/FSharp.Core/seqcore.fs
index 784bdb60ea2..67dff85c8a4 100644
--- a/src/FSharp.Core/seqcore.fs
+++ b/src/FSharp.Core/seqcore.fs
@@ -395,7 +395,8 @@ module RuntimeHelpers =
         let disposeOriginal() =
             if shouldDisposeOriginalAtTheEnd then
                 shouldDisposeOriginalAtTheEnd <- false
-                originalSource.Value.Dispose() 
+                if originalSource.IsValueCreated then
+                    originalSource.Value.Dispose() 
 
         let moveExceptionHandler exn = 
             exceptionalSource <- Some ((exceptionHandler exn).GetEnumerator())
diff --git a/tests/FSharp.Compiler.ComponentTests/Language/SequenceExpressions/SequenceExpressionTests.fs b/tests/FSharp.Compiler.ComponentTests/Language/SequenceExpressions/SequenceExpressionTests.fs
index b454f291601..a9dcfe2fde4 100644
--- a/tests/FSharp.Compiler.ComponentTests/Language/SequenceExpressions/SequenceExpressionTests.fs
+++ b/tests/FSharp.Compiler.ComponentTests/Language/SequenceExpressions/SequenceExpressionTests.fs
@@ -386,6 +386,61 @@ let whatIsIt =
         |> runCode
         |> shouldSucceed
 
+    // Regression test for https://github.com/dotnet/fsharp/issues/19660
+    [<Fact>]
+    let ``Handler body executes once when source throws immediately and handler yields nothing``() =
+        Fsx """
+let mutable bodyCount = 0
+let result =
+    seq {
+        try yield (1/0)
+        with _ ->
+            bodyCount <- bodyCount + 1
+            ()
+    } |> Array.ofSeq
+if bodyCount <> 1 then failwith $"bodyCount was {bodyCount}"
+if result <> [||] then failwith $"result was %A{result}"
+        """
+        |> runCode
+        |> shouldSucceed
+
+    // When-guard double-execution is by design (RFC FS-1134 L37-38).
+
+    [<Fact>]
+    let ``When guard in seq try-with - false guard falls through correctly``() =
+        Fsx """
+let mutable guard1Count = 0
+let mutable guard2Count = 0
+let result =
+    seq {
+        try yield (1/0)
+        with
+        | _ when (guard1Count <- guard1Count + 1; false) -> yield 1
+        | _ when (guard2Count <- guard2Count + 1; true) -> yield 99
+    } |> Array.ofSeq
+if guard1Count <> 2 then failwith $"guard1Count was {guard1Count}"
+if guard2Count <> 2 then failwith $"guard2Count was {guard2Count}"
+if result <> [|99|] then failwith $"result was %A{result}"
+        """
+        |> runCode
+        |> shouldSucceed
+
+    [<Fact>]
+    let ``When guard in seq try-with executes twice per iteration in for loop``() =
+        Fsx """
+let mutable guardCount = 0
+let result =
+    seq {
+        for x in [0; 0; 0] do
+            try yield (1/x)
+            with _ when (guardCount <- guardCount + 1; true) -> yield 99
+    } |> Array.ofSeq
+if guardCount <> 6 then failwith $"guardCount was {guardCount}"
+if result <> [|99; 99; 99|] then failwith $"result was %A{result}"
+        """
+        |> runCode
+        |> shouldSucceed
+
     [<Theory>]
     [<InlineData("41","42","43")>]
     [<InlineData("()","42","43")>]
