C# RavenDb LoadAsync不返回也不引发异常

C# RavenDb LoadAsync不返回也不引发异常,c#,asynchronous,async-await,task,ravendb,C#,Asynchronous,Async Await,Task,Ravendb,我正在尝试通过WebAPI调用从RavenDb加载文档。当我打开一个异步IDocumentSession并调用LoadAsync时,我没有得到异常或结果,线程立即退出,没有错误代码 我能够绕过API的所有结构并重现错误 以下是不起作用的代码: public IHttpActionResult GetMyObject(long id) { try { var session = RavenDbStoreHolderSingle

我正在尝试通过WebAPI调用从RavenDb加载文档。当我打开一个异步IDocumentSession并调用LoadAsync时,我没有得到异常或结果,线程立即退出,没有错误代码

我能够绕过API的所有结构并重现错误

以下是不起作用的代码:

    public IHttpActionResult GetMyObject(long id)
    {
        try
        {
            var session = RavenDbStoreHolderSingleton.Store.OpenAsyncSession();
            var myObject= session.LoadAsync<MyObject>("MyObject/1").Result;

            return Ok(myObject);

        }
        catch (Exception e)
        {
            return InternalServerError(e);
        }
    }
我只是将对象的Id硬编码为1进行测试,但是为不存在的对象(如MyObject/1)调用函数会得到相同的结果

但是,该代码在以下情况下起作用:

    public async Task<IHttpActionResult> GetMyObject(long id)
    {
        try
        {
            var session = RavenDbStoreHolderSingleton.Store.OpenAsyncSession();
            var myObject= await session.LoadAsync<MyObject>("MyObject/1");

            return Ok(myObject);

        }
        catch (Exception e)
        {
            return InternalServerError(e);
        }
    }
我尝试/摆弄过的东西:

更改调试中捕获的异常 仔细监视Raven Studio,看看我是否能发现任何我没有发现的问题,但我不确定我找对了地方 在未连接调试程序的情况下运行API,以查看是否发生了错误,或者Raven Studio中是否出现了某些内容,但没有任何更改 因此,我想我偶然发现了一个修复方法,但有人能解释为什么其中一个会以如此奇怪的方式失败,而另一个会工作得非常好吗

在实际应用程序中,API调用没有async/await对,但进行调用的代码实际上使用的是async/await

下面是失败的repository类,它导致我研究此问题:

    public async Task<MyObject> Load(string id) 
    { 
        return await _session.LoadAsync<MyObject>(id); 
    } 

失败的第一部分是根据设计,对于ASP.Net异步调用,当调用返回的任务的结果时,您正在阻止同步上下文,并且调用返回数据需要相同的同步上下文。查看Stephen Cleary的以下内容,其中详细解释了相同的机制


第二部分是有效的,因为这是使用它的正确方式,它不再陷入死锁。只有在使用控制台应用程序时,第一部分才能工作,因为控制台应用程序没有要阻止的同步上下文,即使是winforms等其他UI也会有类似的问题,需要使用代码的第二部分

,因此因死锁而退出的线程仍然以代码0退出?而不是一些表示某种问题的值?这开始变得更有意义了——看起来我必须在这个主题上做更多的挖掘。没有死锁意味着线程不会退出,它们永远保持在阻塞状态,直到死锁从外部解决,比如停止进程,杀死一个持有线程。此外,死锁并不意味着异常或错误,因此不会有任何错误代码