Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 CRM 2011早期绑定API与任务并行库一起使用安全吗?_C# 4.0_Dynamics Crm 2011_Task Parallel Library - Fatal编程技术网

C# 4.0 CRM 2011早期绑定API与任务并行库一起使用安全吗?

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:索

通过Threading.Task使用早期绑定API(生成的上下文)创建CRM实体时,我遇到间歇性SaveChangesException

使用下面的代码,我能够重新创建异常-请注意,它是间歇性的,我可以多次运行而不会遇到它

正如您所看到的,我的代码中没有共享状态,我正在为每个操作创建CRM连接、服务和上下文

引发的异常是:

Microsoft.Xrm.Sdk.SaveChangesException:处理此请求时出错。-->System.ArgumentOutOfRangeException:索引超出范围。必须为非负数且小于集合的大小。参数名称:索引

我是否遗漏了一些东西,或者早期绑定的SDK类在多线程环境中使用是否不安全

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?)异常中的堆栈跟踪还有其他内容吗?