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

时间:2016-11-28 15:55:50

标签: c# dynamics-crm dynamics-crm-online dynamics-crm-2016

我目前正在进行升级产品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次后分配的内存量

enter image description here

但是,使用较新的方法无法在任何地方设置此实例模式,并且无论您是否需要,似乎每次都会创建一个全新的连接。以下是同一测试的结果: enter image description here

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

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

1 个答案:

答案 0 :(得分:1)

只要连接字符串不包含RequireNewInstance=true,最新的SDK (8.2.0.1)就会缓存并重新使用连接。

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

所以

CrmServiceClient

两次打印guid和ORG1友好名称。如果您在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(); 中通过了RequireNewInstance=true,那么您会看到打印出来的ORG2。