Сведения о вопросе

Electro Full

18:12, 20th August, 2020

Теги

Sharepoint COMException 0x81020037

Просмотров: 467   Ответов: 2

Я работаю над приложением SharePoint, которое поддерживает импорт нескольких документов в одной операции. У меня также есть обработчик событий ItemAdded, который выполняет некоторое базовое обслуживание метаданных элемента. Это событие срабатывает как для импортированных документов, так и для созданных вручную. Последняя часть головоломки-это функция пакетной операции, которую я реализовал, чтобы запустить рабочий процесс и обновить другое поле метаданных.

Я могу вызвать COMException 0x81020037, извлекая данные файла SPListItem. Этот файл - всего лишь документ формы InfoPath/XML. Я могу изменить XML и успешно подтолкнуть его обратно в SPListItem. Когда я запускаю пользовательскую функцию сразу после этого и изменяю метаданные, это иногда вызывает ошибку COM.

Сообщение об ошибке в основном указывает,что файл был изменен другим потоком. Казалось бы, событие ItemAdded все еще записывает файл обратно в базу данных, в то время как пользовательская функция изменяет метаданные. Я попытался ввести задержки и циклы перехвата ошибок, чтобы попытаться обнаружить, что SPListItem безопасно изменять с небольшим успехом.

Есть ли способ узнать, имеет ли другой поток блокировку на документе?



  Сведения об ответе

LIZA

18:01, 15th August, 2020

Иногда я вижу, как ItemAdded или ItemUpdated стреляют дважды за одну операцию. Вы можете попытаться поставить точку останова в методе ItemAdded() , чтобы подтвердить это.

Решение в моем случае состояло в том, чтобы использовать один поток метода ItemAdded() :

private static object myLock = new object();
public override void ItemAdded(SPItemEventProperties properties) {
    if (System.Threading.Monitor.TryEnter(myLock, TimeSpan.FromSeconds(30))
    {
        //do your stuff here.
        System.Threading.Monitor.Exit(myLock);
    }
}


  Сведения об ответе

ITSME

23:06, 9th August, 2020

Мне придется разобраться с этим и вернуться к вам. Проблема с моей стороны, похоже, заключается в том, что есть код, работающий в другом классе, в другой функции, управляемый другим потоком, все из которых пытаются получить доступ к одной и той же записи.

Я стараюсь избегать использования фиксированной задержки. При любой проблеме с потоками существует патологическая возможность того, что один поток может задержать или заблокировать то, что мы ожидаем. При развертывании на различном серверном оборудовании с разной нагрузкой это очень реальная возможность. На другом конце спектра, даже если бы я пошел с задержкой, я не хочу, чтобы она была очень высокой, особенно 30 секунд. Мой клиент будет импортировать десятки тысяч документов, и задержка любой значительной длины приведет к тому, что импорт займет буквально весь день.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться