gpt4 book ai didi

c# - RavenDb LoadAsync 不返回也不抛出异常

转载 作者:行者123 更新时间:2023-11-30 20:36:10 26 4
gpt4 key购买 nike

我正在尝试通过 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 调用没有异步/等待对,但是进行调用的代码实际上使用了异步/等待。

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

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

最佳答案

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

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

关于c# - RavenDb LoadAsync 不返回也不抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37233772/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com