Message:
System.ObjectDisposedException : Cannot access a disposed object.
Object name: 'Microsoft.Win32.SafeHandles.SafeWaitHandle'.
Stack Trace:
SafeHandle.DangerousAddRef(Boolean& success)
Kernel32.SetEvent(SafeWaitHandle handle)
EventWaitHandle.Set()
Mailbox`1.Post(TMsg msg) line 193
FSharpMailboxProcessor`1.Post(TMsg message) line 419
I can see the above exception occasionally in this test:
|
member this.``After dispose is called, mailbox should stop receiving and processing messages``() = task { |
I assume the expected behavior here is no exception?
I'll try to come up with consistent minimal repro, but the problem seems to be here:
|
match pulse with |
|
| null -> () // no one waiting, leaving the message in the queue is sufficient |
|
| ev -> |
|
// someone is waiting on the wait handle |
|
ev.Set() |> ignore |
ev is disposed and
Set will fail.
The fix seems to be to also assign null to pulse when disposing it here:
|
interface System.IDisposable with |
|
member _.Dispose() = |
|
lock syncRoot (fun () -> |
|
if isNotNull inboxStore then |
|
inboxStore.Clear() |
|
|
|
arrivals.Clear() |
|
isDisposed <- true) |
|
|
|
if isNotNull pulse then |
|
(pulse :> IDisposable).Dispose() |
I can see the above exception occasionally in this test:
fsharp/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/MailboxProcessorType.fs
Line 316 in e6854f5
I assume the expected behavior here is no exception?
I'll try to come up with consistent minimal repro, but the problem seems to be here:
fsharp/src/FSharp.Core/mailbox.fs
Lines 189 to 193 in 69fa88b
evis disposed andSetwill fail.The fix seems to be to also assign null to
pulsewhen disposing it here:fsharp/src/FSharp.Core/mailbox.fs
Lines 336 to 346 in 69fa88b