Безопасно ли использовать API с ранней привязкой CRM 2011 с библиотекой параллельных задач? - PullRequest
1 голос
/ 05 октября 2011

Я испытываю прерывистую исключительную ситуацию SaveChangesException при создании объектов CRM с использованием API раннего связывания (сгенерированный контекст) с помощью Threading.Task.

Используя приведенный ниже код, я могу воссоздать исключение - обратите внимание, что оно периодическии я могу выполнить несколько прогонов, не испытывая его.

Как вы видите, в моем коде нет общего состояния, я создаю соединение CRM, службу и контекст для каждой операции.

ИсключениеВыдается:

Microsoft.Xrm.Sdk.SaveChangesException: при обработке этого запроса произошла ошибка.---> System.ArgumentOutOfRangeException: индекс был вне диапазона.Должен быть неотрицательным и меньшим, чем размер коллекции.Имя параметра: index

Я что-то здесь упустил или классы 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);            
            }
        }
    }

1 Ответ

1 голос
/ 15 ноября 2011

Исключение происходит на более низком уровне в конфигурации WCF.Для тех, кто использует объекты с поздней привязкой, обходной путь должен отключить свойство ProxyTypesEnabled в CrmConnection.Другой обходной путь - установить для ServiceConfigurationMode значение PerInstance, но, к сожалению, это приводит к снижению производительности.Примечание: оба из них могут быть установлены через строку подключения.

var connection1 = new CrmConnection("Crm")
{
    ProxyTypesEnabled = false
}; // late-bound only

var connection2 = new CrmConnection("Crm")
{
    ServiceConfigurationInstanceMode = ServiceConfigurationInstanceMode.PerInstance
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...