Я испытываю прерывистую исключительную ситуацию 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);
}
}
}