SharePoint и безопасность потоков - PullRequest
2 голосов
/ 24 ноября 2008

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

На самом деле я пока не нашел много информации об этом.

Так что я с нетерпением жду ваших ответов.

Bye, Flo

Ответы [ 3 ]

7 голосов
/ 24 ноября 2008

В SharePoint OM гораздо больше подводных камней, чем просто безопасность старых потоков. Обратите особое внимание на работу с объектами, полученными из свойств. Вы должны всегда держать указатель на объект, пока вы над ним работаете; Пример:

var list = web.List["MyList"]
list.Items[0]["Field1"] = "foo"
list.Items[0]["Field2"] = "bar"
list.Items[0].Update() // nothing is updated!

Вы можете ожидать, что Field1 и Field2 будут обновлены последним вызовом Update (), но нет. Каждый раз, когда вы используете индексатор, возвращается НОВАЯ ссылка на SPListItem.

Правильный путь:

SPListItem item = list.Items[0]
item["Field1"] = "foo"
item["Field2"] = "bar"
item.Update() // updated!

Просто начало. Также поищите подводные камни вокруг шаблона IDisposabe / Dispose.

-Oisin

2 голосов
/ 24 ноября 2008

Есть одна проблема, с которой я часто сталкиваюсь: когда вы пишете свои собственные получатели элементов списка, вам нужно учитывать тот факт, что некоторые события запускаются асинхронно, например ItemAdded(), что означает ваш код может выполняться в нескольких потоках одновременно.

0 голосов
/ 04 декабря 2008

Таким образом, после еще нескольких поисков в Интернете и поиска в Интернете и тестирования, кажется, что вам больше не нужно заботиться о безопасности потоков при использовании объектной модели MOSS, потому что вы всегда работаете с нестатическим и уникальные экземпляры.

Кроме того, возникает исключение, когда объект, например, SPWeb был изменен и сохранен путем вызова метода Update () перед сохранением изменений (также вызывая метод Update ()), даже если вы сначала получили свой объект.

В следующем примере инструкция web11.Update() сгенерирует исключение, сообщающее, что SPWeb, представленный через объект web12, был тем временем изменен.

SPSite siteCol1 = new SPSite("http://localhost");      

SPWeb web11 = siteCol1.OpenWeb();
SPWeb web12 = siteCol1.OpenWeb();                               

web12.Title = "web12";
web12.Update();

web11.Title = "web11";
web11.Update();

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

...