[英]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=true
不RequireNewInstance=true
,最新的SDK (8.2.0.1)就会缓存并重新使用连接。
值得注意的是,即使您使用唯一的连接字符串(指向不同的CRM组织)新建另一个CrmServiceClient
,但连接字符串不包含RequireNewInstance=true
, CrmServiceClient
也将重用以前的缓存连接。
所以
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.