2008-08-22 2 views
1

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

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

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

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

ответ

1

Иногда я вижу 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); 
    } 
} 
0

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

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

Смежные вопросы