【问题标题】:RavenDb LoadAsync Not Returning and Not Throwing ExceptionsRavenDb LoadAsync 不返回也不抛出异常
【发布时间】:2016-05-15 13:24:40
【问题描述】:

我正在尝试通过 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。

这是导致我调查此问题的失败的存储库类:

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

【问题讨论】:

    标签: c# asynchronous async-await task ravendb


    【解决方案1】:

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

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

    【讨论】:

    • 那么由于死锁而退出的线程仍然以代码0退出?而不是一些表明某种问题的价值?这开始变得更有意义了 - 看起来我必须对这个主题做更多的挖掘。
    • 没有死锁意味着线程不会退出,它们永远保持在阻塞状态,直到并且除非死锁在外部解决,比如停止进程,杀死一个持有线程。并且死锁并不意味着异常或错误,因此不会有任何错误代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    相关资源
    最近更新 更多