@@ -8,6 +8,7 @@ open System
88open System.IO
99open System.Threading
1010open System.Threading .Tasks
11+ open System.Runtime .ExceptionServices
1112
1213#nowarn " 40"
1314
@@ -41,7 +42,7 @@ module internal Utils =
4142 /// just OnNext method that gets 'ObservableUpdate' as an argument.
4243 type internal ObservableUpdate < 'T > =
4344 | Next of 'T
44- | Error of exn
45+ | Error of ExceptionDispatchInfo
4546 | Completed
4647
4748
@@ -55,7 +56,7 @@ module internal Utils =
5556 ({ new IObserver<_> with
5657 member x.OnNext ( v ) = observer.OnNext( Next v)
5758 member x.OnCompleted () = observer.OnNext( Completed)
58- member x.OnError ( e ) = observer.OnNext( Error e ) }) }
59+ member x.OnError ( e ) = observer.OnNext( Error ( ExceptionDispatchInfo.Capture e ) ) }) }
5960
6061 type Microsoft.FSharp.Control.Async with
6162 /// Starts the specified operation using a new CancellationToken and returns
@@ -258,7 +259,7 @@ module AsyncSeq =
258259 let res = ref Unchecked.defaultof<_>
259260 try
260261 res := Choice1Of2 ( inp .GetEnumerator ())
261- with exn ->
262+ with exn ->
262263 res := Choice2Of2 exn
263264 match res.Value with
264265 | Choice1Of2 r ->
@@ -700,7 +701,7 @@ module AsyncSeq =
700701 while not fin.Value do
701702 let! msg = agent.Receive()
702703 match msg with
703- | Observable.ObservableUpdate.Error e -> raise e
704+ | Observable.ObservableUpdate.Error e -> e.Throw ()
704705 | Observable.Completed -> fin := true
705706 | Observable.Next v -> yield v
706707 finally
@@ -735,7 +736,7 @@ module AsyncSeq =
735736 do ! iter ( Observable.Next >> buf.Add) source
736737 buf.CompleteAdding()
737738 with err ->
738- buf.Add( Observable.Error err)
739+ buf.Add( Observable.Error ( ExceptionDispatchInfo.Capture err) )
739740 buf.CompleteAdding()
740741 }
741742 |> fun p -> Async.StartAsTask( p, cancellationToken = cts.Token)
@@ -744,7 +745,7 @@ module AsyncSeq =
744745 for x in buf.GetConsumingEnumerable() do
745746 match x with
746747 | Observable.Next v -> yield v
747- | Observable.Error err -> raise err
748+ | Observable.Error err -> err.Throw ()
748749 | Observable.Completed -> failwith " unexpected"
749750 }
750751
@@ -1072,9 +1073,9 @@ module AsyncSeq =
10721073 member x.Dispose () =
10731074 let err = ref None
10741075 for i in ss.Length - 1 .. - 1 .. 0 do
1075- try dispose ss.[ i] with e -> err := Some e
1076+ try dispose ss.[ i] with e -> err := Some ( ExceptionDispatchInfo.Capture e )
10761077 match ! err with
1077- | Some e -> raise e
1078+ | Some e -> e.Throw ()
10781079 | None -> ()
10791080
10801081 let mergeAll ( ss : AsyncSeq < 'T > list ) : AsyncSeq < 'T > =
0 commit comments