Azure cosmosdb DocumentDB调用挂起

Azure cosmosdb DocumentDB调用挂起,azure-cosmosdb,Azure Cosmosdb,我正在调用我的DocumentDB数据库来查询一个人。如果此人不在数据库中,我将尝试将此人插入我的集合中 当我检查集合时,我看到正在创建新的人员,但我的代码似乎挂起在我进行第二次调用以将人员插入集合的位置。知道为什么我的代码挂起了吗?我没有包括所有节省空间的代码,例如GetDatabaseAsync()、GetCollectionAsync()等,它们都在工作 using (client = new DocumentClient(new Uri(endPointUrl), authorizati

我正在调用我的DocumentDB数据库来查询一个人。如果此人不在数据库中,我将尝试将此人插入我的集合中

当我检查集合时,我看到正在创建新的人员,但我的代码似乎挂起在我进行第二次调用以将人员插入集合的位置。知道为什么我的代码挂起了吗?我没有包括所有节省空间的代码,例如GetDatabaseAsync()、GetCollectionAsync()等,它们都在工作

using (client = new DocumentClient(new Uri(endPointUrl), authorizationKey))
{
   //Get the database
   var database = await GetDatabaseAsync();

   //Get the Document Collection
   var collection = await GetCollectionAsync(database.SelfLink, "People");

   string sqlQuery = "SELECT * FROM People f WHERE f.id = \"" + user.PersonId + "\"";

   dynamic doc = client.CreateDocumentQuery(collection.SelfLink, sqlQuery).AsEnumerable().FirstOrDefault();

   if (doc == null)
   {
      // User is not in the database. Add user to the database
      try
      {
         **// This is where the code is hanging. It creates the user in my collection though!**
         await client.CreateDocumentAsync(collection.DocumentsLink, user);
      }
      catch
      {
         // Handle error
      }
   }
   else
   {
      // User is already in the system.
      user = doc;
   }
}
代码挂起是否可能是因为我试图在同一USING语句中查询和插入文档


对我来说,创建一个新的客户端实例并创建一个单独的块来处理文档插入是否更好?

DocumentDB的客户端SDK中似乎有一个bug。尝试使用
client.createDocumentsSync(collection.DocumentsLink,user).Wait()
而不是
Wait client.createDocumentsSync(collection.DocumentsLink,user)



更新:这很可能在最新的SDK中已修复,因为我无法再复制它。

如果对异步方法的调用挂起,通常是因为通过使用.Wait()或.Result调用它而不是等待来同步调用它。您尚未显示您的呼叫代码,请将其包含在此处

选项1: 不要同步调用异步方法。这是正确的方法

选项2: 如果同步调用此方法,则应在对DocDB的异步调用中使用.ConfigureAwait(false)。试试这个:

var database = await GetDatabaseAsync()**.ConfigureAwait(false)**;
...
var collection = await GetCollectionAsync(database.SelfLink, "People")**.ConfigureAwait(false)**;
...
await client.CreateDocumentAsync(collection.DocumentsLink, user)**.ConfigureAwait(false)**;

关于

的更多细节,我在这里没有看到任何令人瞠目结舌的危险信号。重新使用客户端应该更快—它避免了与数据库服务器进行另一次握手。你能给我一个关于这个的时间配置文件的想法吗?初始查询需要多长时间?文档创建需要多长时间?发布这个问题后,我决定简化我的逻辑,所以我只做了插入部分。我还是会超时。请看这篇文章:如何获取时间配置文件?你的意思是,在我的代码中加入一些DateTime变量来捕获代码执行每一行的确切时间,还是有一个工具可以用来捕获时间配置文件?还有,你知道为什么DocumentDB在CreateDocumentSync()之后不返回响应吗?在你的调用堆栈中,有没有从非异步方法调用异步方法的地方?这似乎仍在发生,他们现在还没有解决这个问题吗?最初我们对azure service fabric项目也做了同样的事情,现在我们将其转换为web应用程序,现在相同的代码占用了太多的时间。