C# 为什么将CosmosClient声明为私有静态解决了我的问题?

C# 为什么将CosmosClient声明为私有静态解决了我的问题?,c#,azure-cosmosdb,C#,Azure Cosmosdb,我在使用CosmosDB SDK v3时遇到了严重的套接字和缓冲区故障问题,经过一段时间的故障排除,我在参考文档中发现客户端应该声明为私有和静态 我声明如下 CosmosClient cosmosClient = new CosmosClient(cosmosDBEndpointUrl, cosmosDBPrimaryKey, new CosmosClientOptions() { AllowBulkExecution = false }); 所以我改成了这个 private static C

我在使用CosmosDB SDK v3时遇到了严重的套接字和缓冲区故障问题,经过一段时间的故障排除,我在参考文档中发现客户端应该声明为私有和静态

我声明如下

CosmosClient cosmosClient = new CosmosClient(cosmosDBEndpointUrl, cosmosDBPrimaryKey, new CosmosClientOptions() { AllowBulkExecution = false });
所以我改成了这个

private static CosmosClient cosmosClient = new CosmosClient(cosmosDBEndpointUrl, cosmosDBPrimaryKey, new CosmosClientOptions() { AllowBulkExecution = false });
到目前为止,这似乎已经解决了这个问题

有人能给我解释一下为什么这能简单地解决我的问题吗?区别在于它确保一个客户机被重新用于所有连接吗?否则我就看不出为什么会有什么不同了

CosmosClient是线程安全的。建议保持单一的 每个应用程序生命周期的CosmosClient实例 高效的连接管理和性能。请参阅 性能指南

CosmosClient是线程安全的。建议保持单一的 每个应用程序生命周期的CosmosClient实例 高效的连接管理和性能。请参阅 性能指南


正如您所说,static确保应用程序中只有一个实例,这是CosmosClient的最佳实践,限制其他资源(如HttpClient)的使用也很重要

它不需要是私人的

下面是一个代码示例,它将使用延迟加载来初始化您的CosmosClient(或者在本例中是DocumentClient),这将使您的应用程序启动得稍微快一点

private static Lazy<DocumentClient> lazyClient = new Lazy<DocumentClient>(InitializeDocumentClient);
private static DocumentClient documentClient => lazyClient.Value;

private static DocumentClient InitializeDocumentClient()
{
    var endpointUrl = Environment.GetEnvironmentVariable("CosmosEndpoint", EnvironmentVariableTarget.Process);
    var authorizationKey = Environment.GetEnvironmentVariable("CosmosAuthorizationKey", EnvironmentVariableTarget.Process);
    return new DocumentClient(new Uri(endpointUrl), authorizationKey, ConnectionPolicy);
}

public static DocumentClient DocumentClient { get { return documentClient; } }
private static Lazy lazyClient=new Lazy(InitializeDocumentClient);
私有静态DocumentClient DocumentClient=>lazyClient.Value;
私有静态文档客户端初始化文档客户端()
{
var endpointUrl=Environment.GetEnvironmentVariable(“CosmosEndpoint”,EnvironmentVariableTarget.Process);
var authorizationKey=Environment.GetEnvironmentVariable(“CosmosAuthorizationKey”,EnvironmentVariableTarget.Process);
返回新的DocumentClient(新Uri(endpointUrl)、authorizationKey、ConnectionPolicy);
}
公共静态DocumentClient DocumentClient{get{return DocumentClient;}}

正如您所说,static确保应用程序中只有一个实例,这是CosmosClient的最佳实践,限制其他资源(如HttpClient)的使用也很重要

它不需要是私人的

下面是一个代码示例,它将使用延迟加载来初始化您的CosmosClient(或者在本例中是DocumentClient),这将使您的应用程序启动得稍微快一点

private static Lazy<DocumentClient> lazyClient = new Lazy<DocumentClient>(InitializeDocumentClient);
private static DocumentClient documentClient => lazyClient.Value;

private static DocumentClient InitializeDocumentClient()
{
    var endpointUrl = Environment.GetEnvironmentVariable("CosmosEndpoint", EnvironmentVariableTarget.Process);
    var authorizationKey = Environment.GetEnvironmentVariable("CosmosAuthorizationKey", EnvironmentVariableTarget.Process);
    return new DocumentClient(new Uri(endpointUrl), authorizationKey, ConnectionPolicy);
}

public static DocumentClient DocumentClient { get { return documentClient; } }
private static Lazy lazyClient=new Lazy(InitializeDocumentClient);
私有静态DocumentClient DocumentClient=>lazyClient.Value;
私有静态文档客户端初始化文档客户端()
{
var endpointUrl=Environment.GetEnvironmentVariable(“CosmosEndpoint”,EnvironmentVariableTarget.Process);
var authorizationKey=Environment.GetEnvironmentVariable(“CosmosAuthorizationKey”,EnvironmentVariableTarget.Process);
返回新的DocumentClient(新Uri(endpointUrl)、authorizationKey、ConnectionPolicy);
}
公共静态DocumentClient DocumentClient{get{return DocumentClient;}}

这也是所谓的单例类吗?单例类限制自己被多次实例化,这里的情况并非如此。可以多次实例化CosmosClient,但您不能这样做。这也是所谓的单例吗?单例类会限制自己多次实例化,而这里的情况并非如此。可以多次实例化CosmosClient,但您不能这样做。