繁体   English   中英

Microsoft.Xrm.Tooling.Connector高内存分配

[英]Microsoft.Xrm.Tooling.Connector High Memory Allocation

我目前正在完成升级产品CRM SDK的过程,我遇到的主要变化是使用以下尝试和信任的方法连接到Xrm服务并创建我的IOrganizationService:

var connection = CrmConnection.Parse(connectionString);
var service = new OrganizationService(connection);

我现在不得不使用Tooling命名空间中的CrmServiceClient:

 CrmServiceClient conn = new Microsoft.Xrm.Tooling.Connector.CrmServiceClient(connectionString).OrganizationServiceProxy;

现在这一切都很好,除了一个主要问题......记忆。

使用较旧的Xrm.Client方法,您可以指定服务配置实例模式(默认为ServiceConfigurationInstanceMode.PerName)。 这意味着如果同一个应用程序多次调用create,则会重用该服务。 这使内存占用率降低。 下图显示了在调用创建服务实例100次后分配的内存量

在此输入图像描述

但是,使用较新的方法无法在任何地方设置此实例模式,似乎每次都会创建一个全新的连接,无论您是否需要它。 以下是同一测试的结果: 在此输入图像描述

如您所见,每次新连接都会分配越来越多的内存。 我无法看到我可以告诉它重用该服务的任何地方。

所以我基本上要问的是,我是以错误的方式解决这个问题吗? 我应该自己创建和缓存一切吗? 我缺少隐藏的课程/方法吗? 任何帮助将不胜感激。

只要连接RequireNewInstance=trueRequireNewInstance=true ,最新的SDK (8.2.0.1)就会缓存并重新使用连接。

值得注意的是,即使您使用唯一的连接字符串(指向不同的CRM组织)新建另一个CrmServiceClient ,但连接字符串不包含RequireNewInstance=trueCrmServiceClient也将重用以前的缓存连接。

所以

var connectionString = $@"Url=https://ORG1.crm.dynamics.com;AuthType=Office365;UserName=USER@DOMAIN.com;Password=PASSWORD";
var connectionString2 = $@"Url=https://ORG2.crm.dynamics.com;AuthType=Office365;UserName=USER@DOMAIN.com;Password=PASSWORD";       

var crmSvcClient = new CrmServiceClient(connectionString);
((WhoAmIResponse)crmSvcClient.Execute(new WhoAmIRequest())).OrganizationId.Dump();
crmSvcClient.ConnectedOrgFriendlyName.Dump();

var crmSvcClient2 = new CrmServiceClient(connectionString2);
((WhoAmIResponse)crmSvcClient2.Execute(new WhoAmIRequest())).OrganizationId.Dump();
crmSvcClient2.ConnectedOrgFriendlyName.Dump();

两次打印guid和ORG1友好名称。 如果您在connectionstring2传递RequireNewInstance=true ,那么您将看到ORG2打印出来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM