Asynchronous 找到Microsoft.FSharp.Control.Trampoline引发的异常

Asynchronous 找到Microsoft.FSharp.Control.Trampoline引发的异常,asynchronous,f#,Asynchronous,F#,我负责一个F#WPF应用程序。当发生未处理的异常时,它会向我发送电子邮件。大多数情况下,我能够从错误消息和堆栈跟踪中识别异常的来源。但是,我偶尔会收到如下消息,其中不包括堆栈跟踪中的任何代码 [<EntryPoint>] let main argv = async { printfn "Inside async block." let o = null o.GetType() |> ignore } |>

我负责一个F#WPF应用程序。当发生未处理的异常时,它会向我发送电子邮件。大多数情况下,我能够从错误消息和堆栈跟踪中识别异常的来源。但是,我偶尔会收到如下消息,其中不包括堆栈跟踪中的任何代码

[<EntryPoint>]
let main argv = 

    async { printfn "Inside async block."
            let o = null
            o.GetType() |> ignore
    } |> Async.Start

    System.Console.ReadKey(true) |> ignore
    0 // return an integer exit code
摘要:
对象引用未设置为对象的实例。
--------------
细节:
System.NullReferenceException:
对象引用未设置为对象的实例。
在Microsoft.FSharp.Control.CancellationTokenOps上。Start@1234-1.调用(例外情况e)
在$Control。loop@435-40(本次蹦床,FSharpFunc`2动作)
在Microsoft.FSharp.Control.Trampoline.ExecuteAction(FSharpFunc`2 firstAction)中
在Microsoft.FSharp.Control.TrampolineHolder.Protect(FSharpFunc`2 firstAction)上
在$Control-ctor@520-1.调用(对象状态)
位于System.Threading.QueueUserWorkItemCallback.WaitCallback_上下文(对象状态)
位于System.Threading.ExecutionContext.RunInternal(ExecutionContext ExecutionContext、ContextCallback回调、对象状态、布尔值preserveSyncCtx)
在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态,布尔保存SyncCTX)
位于System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()处
在System.Threading.ThreadPoolWorkQueue.Dispatch()中
在System.Threading.\u ThreadPoolWaitCallback.PerformWaitCallback()中
此堆栈跟踪中有哪些线索可以帮助我识别此异常的来源?

例如,我假设原始异常是在
async
计算中抛出的。(我的大多数异步代码都基于F#async块。)我的
NullReferenceException
是否会发生在
async
块中的任何位置?我注意到异常发生在
Start()
方法中。还是这样?该
Start()
方法接受一个
Exception
实例,因此该异常可能是在此之前引发的。这能告诉我什么吗?我想知道是否有人对Microsoft.FSharp.Control.Trampoline足够熟悉,可以为我指明正确的方向


顺便说一下,在我的错误处理代码中,我非常小心地检查所有
内部异常
和处理
聚合异常
。因此,我认为这是异常实例中可用的所有信息,但我可能错了。

我做了一个快速测试。以下控制台程序生成相同的堆栈跟踪

[<EntryPoint>]
let main argv = 

    async { printfn "Inside async block."
            let o = null
            o.GetType() |> ignore
    } |> Async.Start

    System.Console.ReadKey(true) |> ignore
    0 // return an integer exit code
[]
让主argv=
异步块内的异步{printfn“
设o=null
o、 GetType()|>忽略
}|>异步启动
System.Console.ReadKey(true)|>忽略
0//返回整数退出代码
这告诉我:

  • 神秘异常发生在异步块中
  • 它可能发生在异步块中的任何位置
  • 诊断的唯一方法是改进异步块周围的错误处理(可能使用async.Catch),重新部署应用程序的新版本,并等待它再次发生

  • 只是猜测而已。你看到了吗?没有,我没有看到。堆栈跟踪略有不同,因此我认为这是一个不同的问题。不过,知道这一点似乎很好。为了将来的参考,下面是Trampoline.ExecuteAction(…)的代码。我想知道关于源异常的更多信息是否可以在那里的某个地方捕捉到。如果对这个问题的答案应该是深刻的。