当前位置: 首页 > 知识库问答 >
问题:

在cosmosdb中创建文档时取消

狄峻熙
2023-03-14

我们正在使用cosmosdb记录我们的应用程序日志。我们的日志有两层,一层有一般的信息,另一层有一般日志的更详细的信息。我们还在其他两个集合中记录了这些的副本以供备份。所以我们总共有四个系列。在我们的代码中,我们使用异步CreateDocumentAsync来创建这些日志。我们将任务存储在列表中,并使用Task.waitall来完成所有任务。在开发环境中,我们没有看到任何错误,但在生产中,当创建新文档时,我们会在应用程序洞察中看到取消的错误。下面的示例图片。

下面是我们正在使用的代码结构

API控制器代码

public void Log(LogModel logObject)
{
    try
    {
        _context.Save(logObject);
    }
    catch(Exception ex)
    {
        _azureTelemtry.TrackTrace($"Exception occured: {ex.ToString()}");
    }
}

上下文保存方法

public void Save(LogModel logObject)
{
    List<Task> saveTasks = new List<Task>();
    LogInfo logInfo = logObject.logInfo;
    LogDetails logDetails = logObject.logDetails;
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, primaryLogInfoCollectionID), logInfo));
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, archieveLogInfoCollectionID), logInfo));    
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, primaryLogDetailsCollectionID), logDetails));
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, archieveLogDetailsCollectionID), logDetails));
    Task.WaitAll(saveTasks.ToArrays());
}

异常详细信息

共有1个答案

秦锐
2023-03-14

您不等待任务。此外,save函数是同步的,因此task.waitall(savetasks.toArrays());运行synchronpusly

至少我认为public void Save(LogModel logObject)应该是public Task Save(LogModel logObject)Task.waitall(savetasks.toarrays());应该是return Task.whenall(savetasks.toarrays());

public Task Save(LogModel logObject)
{
    List<Task> saveTasks = new List<Task>();
    LogInfo logInfo = logObject.logInfo;
    LogDetails logDetails = logObject.logDetails;
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, primaryLogInfoCollectionID), logInfo));
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, archieveLogInfoCollectionID), logInfo));    
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, primaryLogDetailsCollectionID), logDetails));
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, archieveLogDetailsCollectionID), logDetails));

    return Task.WhenAll(saveTasks.ToArrays());
}

如果您的意图是激发任务并忘记,现在可以使用_context.save(logObject);,但除此之外,您需要使用task

另一个问题是:上面的代码打开了4个任务,无法控制地处理它。NET Core中的默认并发执行限制为10。现在,假设save方法先后调用了三次,但都没有完成。这意味着您需要有12个并发任务。但是。NET核心的限制是10个。我相信最后两个任务将被取消。

 类似资料:
  • 尝试使用REST API创建文档时,出现以下错误: 在各种SDK中,有一个可选参数要包含,,如果设置为则如果未提供ID,将拒绝带有此错误的请求。我提出了一个非常简单的REST请求,所以我自己没有添加这个参数(我甚至不知道我会添加什么头——大概是头——因为RESTAPI的文档没有涵盖它)。 唯一需要注意的是,集合有一个定义的分区键。我找不到任何文档说如果定义了分区键就需要一个ID,但是情况似乎就是这

  • 我想创建一个Azure函数,它接受传递给它的JSON主体,并将该文档插入到Azure COSMOSDB实例中。 并按如下方式实现该函数: 在门户中,我放入了一个简单的示例文档:

  • 我想实现使用azure cosmos DB创建文档的幂等性。请让我知道cosmos-db(文档db)是否开箱即用地支持此功能。 为此我使用了SQL api。

  • 我试图实现的很简单。只有当数据库不存在时,我才需要在数据库中创建一个用户条目。 应用程序流程: 使用Firebase身份验证(获取UID)创建用户 客户端代码(创建操作): firestore规则: 附加信息: 正如您可能已经知道的那样,代码不起作用。每次我运行客户端代码时,当前用户都会被一个新文档完全替换。但是,如果我从规则中删除以下行,一切都会正常工作: 但现在问题来了,如何保护用户文档中的数

  • 我一直试图弄清楚如何从特定查询中读取我的列表。如果我注释掉其中一个应用程序,get它会从一个文档数据库读取,反之亦然。如何让它同时读取我的两个查询,或者指定一个列表从一个查询中读取,另一个列表从第二个查询中读取?我尝试了第二个查询Spec,不确定这是否是要走的路。 谢谢你 我能够从上一个问题中获得帮助。连接到多个宇宙数据库文档 原始教程:https://docs.microsoft.com/en-

  • 是否可以在同一事务中使用Cloud FiRecovery针对集合创建多个文档? 我正在查看批处理写入的留档。除非我弄错了(我是Firebase的新手,可能是这样),这些示例旨在演示“批处理写入”,但示例仅显示正在更新的单个字段。