C# 4.0 CRM 2011早期绑定API与任务并行库一起使用安全吗?
通过Threading.Task使用早期绑定API(生成的上下文)创建CRM实体时,我遇到间歇性SaveChangesException 使用下面的代码,我能够重新创建异常-请注意,它是间歇性的,我可以多次运行而不会遇到它 正如您所看到的,我的代码中没有共享状态,我正在为每个操作创建CRM连接、服务和上下文 引发的异常是: Microsoft.Xrm.Sdk.SaveChangesException:处理此请求时出错。-->System.ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小。参数名称:索引 我是否遗漏了一些东西,或者早期绑定的SDK类在多线程环境中使用是否不安全C# 4.0 CRM 2011早期绑定API与任务并行库一起使用安全吗?,c#-4.0,dynamics-crm-2011,task-parallel-library,C# 4.0,Dynamics Crm 2011,Task Parallel Library,通过Threading.Task使用早期绑定API(生成的上下文)创建CRM实体时,我遇到间歇性SaveChangesException 使用下面的代码,我能够重新创建异常-请注意,它是间歇性的,我可以多次运行而不会遇到它 正如您所看到的,我的代码中没有共享状态,我正在为每个操作创建CRM连接、服务和上下文 引发的异常是: Microsoft.Xrm.Sdk.SaveChangesException:处理此请求时出错。-->System.ArgumentOutOfRangeException:索
class Program
{
static void Main(string[] args)
{
foreach (var index in Enumerable.Range(1, 400))
{
var capturedIndex = index;
Task.Factory.StartNew(() => CreateContact(capturedIndex));
}
Console.Read();
}
private static void CreateContact(int i)
{
var contact = new Contact {FirstName = "Test", LastName = string.Concat("Contact_", i)};
var context = new XrmServiceContext(new OrganizationService(new CrmConnection("Crm"))); // The generated context is taken from the SDK samples
context.AddObject(contact);
try
{
context.SaveChanges();
Console.WriteLine(string.Concat("Contact created - ", i));
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
该异常发生在WCF配置的较低级别。对于那些使用后期绑定实体的用户,解决方法是禁用CrmConnection上的ProxyTypesEnabled属性。另一个解决方法是将ServiceConfigurationMode设置为PerInstance,但不幸的是,这会影响性能。注意:这两个参数也可以通过连接字符串进行设置
var connection1 = new CrmConnection("Crm")
{
ProxyTypesEnabled = false
}; // late-bound only
var connection2 = new CrmConnection("Crm")
{
ServiceConfigurationInstanceMode = ServiceConfigurationInstanceMode.PerInstance
};
该异常发生在WCF配置的较低级别。对于那些使用后期绑定实体的用户,解决方法是禁用CrmConnection上的ProxyTypesEnabled属性。另一个解决方法是将ServiceConfigurationMode设置为PerInstance,但不幸的是,这会影响性能。注意:这两个参数也可以通过连接字符串进行设置
var connection1 = new CrmConnection("Crm")
{
ProxyTypesEnabled = false
}; // late-bound only
var connection2 = new CrmConnection("Crm")
{
ServiceConfigurationInstanceMode = ServiceConfigurationInstanceMode.PerInstance
};
在控制台应用程序中使用Parallel.For时,我碰巧注意到类似的奇怪之处,但我只是使用了后期绑定的实体对象。我的代码看起来非常相似,但使用了OrganizationService.Create方法。很奇怪!就上下文而言,每个任务/线程应该有一个上下文。我没有答案,但这可能是组织web服务的一个限制(如wcf的maxconcurrentcalls?)异常中的堆栈跟踪还有其他内容吗?我在使用Parallel时碰巧注意到类似的奇怪之处。因为在控制台应用程序中,我只是使用了后期绑定实体对象。我的代码看起来非常相似,但使用了OrganizationService.Create方法。很奇怪!就上下文而言,每个任务/线程应该有一个上下文。我没有答案,但这可能是组织web服务的一个限制(如wcf的maxconcurrentcalls?)异常中的堆栈跟踪还有其他内容吗?